我现在已经阅读了几个小时的.htaccess文件了,我想我已经开始明白这个想法,但我仍然需要一些帮助。我发现various answers around但仍不确定如何执行此操作。
据我了解,您为每个页面扩展编写了一个规则,您想要“美化”,所以如果您有something.php
,anotherpage.php
,thispage.php
等他们期待(会收到??)参数,每个都需要自己的规则。这是对的吗?
我想要更改的网站有这样的网址,
maindomain.com/sue.php?r=word1%20word2
并且至少有一个带有两个参数的页面
maindomain.com/kevin.php?r=place%20name&c=person%20name
所以我想做的是
maindomain.com/sue/word1-word2/
maindomain.com/kevin/place-name/person-name/
保留此.php页面并使其看起来像目录。我读过的大多数教程都涉及如何删除传递参数的.php页面。但我想保留它。
我怀疑的问题是,网址的所有.php?r=
部分都是相同的,即sue.php?r=
,kevin.php?r=
,而.htaccess根据文件名决定更改哪个网址然后省略它。如果我想保留文件名,我必须更改?r=
这是个人的吗?我希望这是有道理的。到目前为止,我有这个,但我相信它不会起作用。
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1
RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1&c=$1
我认为我必须在某个部分或某种方式添加([^-]*)
这个,以便它检测到网址的%20
部分,但之后如何将其转换为-
。另外,我的$_GET
函数如何工作?
我希望我的问题有道理
答案 0 :(得分:1)
你在这些规则的某个地方错过了一个空间,但我认为你在制定两个单独的规则时有正确的想法。更难的问题是将所有-
转换为空格。让我们从转换为GET变量开始:
# check that the "sue.php" actually exists:
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/?$ /$1.php?r=$2 [L,QSA]
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$ /$1.php?r=$2&c=$3 [L,QSA]
这些将采用看起来像/sue/blah/
和
sue
部分/document_root/sue.php
是否确实存在/sue/blah/
重写为/sue.php?r=blah
同样的事情适用于2个字的URI
类似于/kevin/foo/bar/
:
kevin
部分/document_root/kevin.php
是否确实存在
3将/kevin/foo/bar/
重写为/kevin.php?r=foo&c=bar
现在,要摆脱“ - ”并将它们更改为空格:
RewriteCond %{QUERY_STRING} ^(.*)(c|r)=([^&]+)-(.*)$
RewriteRule ^(.*)$ /$1?%1%2=%3\ %4 [L]
这看起来有点乱,但条件与查询字符串匹配,在查询字符串中查找c=
或r=
,与-
的值匹配c=
1}}或r=
,然后重写查询字符串以将-
替换为(请注意,空格被编码为
%20
)。这将删除GET参数-
和c
值中的所有r
个实例,并用空格替换它们。