我正在尝试使用htaccess Rewrite Rules来映射多个GET变量,但并非所有变量都是必需的。我已经对变量进行了排序,以便始终需要x,如果设置了y,则必须设置z,等等。所以我需要映射看起来像这样:
example.com/section/topic/sub
映射到
example.com/?x=section&z=topic&y=sub
但是,以下代码会导致内部错误,但如果我只有一个重写规则,则可以正常工作。
Options +FollowSymLinks
Options -indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ([^/]+)/? [NC]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$ ?x=$1&z=$2&y=$3&r=$4 [NC,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ ?x=$1&z=$2&y=$3 [NC,L]
RewriteRule ^([^/]+)/([^/]+)$ ?x=$1&z=$2 [NC,L]
RewriteRule ^([^/]+)$ ?x=$1 [NC,L]
</IfModule>
我还需要确保网址可以有尾随/,但不需要它。
你可能会说,我是htaccess的新手。
谢谢
答案 0 :(得分:12)
RewriteCond %{REQUEST_URI} ([^/]+)/?
正在做什么。/?$
您可以在DOCUMENT_ROOT/.htaccess
:
Options +FollowSymLinks -indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
## If the request is for a valid directory
RewriteCond %{REQUEST_FILENAME} -d [OR]
## If the request is for a valid file
RewriteCond %{REQUEST_FILENAME} -f [OR]
## If the request is for a valid link
RewriteCond %{REQUEST_FILENAME} -l
## don't do anything
RewriteRule ^ - [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ ?x=$1&z=$2&y=$3&r=$4 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ ?x=$1&z=$2&y=$3 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ ?x=$1&z=$2 [L,QSA]
RewriteRule ^([^/]+)/?$ ?x=$1 [L,QSA]
</IfModule>
答案 1 :(得分:2)
看起来你要做一些只能在一条规则中实现的事情会遇到很多麻烦:
RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?a=$1&b=$2&c=$3&d=$4
这将始终在PHP
中返回类似的内容:
//var_dump($_GET);
array(4) {
["a"]=>
string(#) "VALUE"
["b"]=>
string(#) "VALUE"
["c"]=>
string(#) "VALUE"
["d"]=>
string(#) "VALUE"
}
VALUE
如果未在网址中设置为空,或者如果设置了则值为
N.B。您可能还需要添加不是实际文件/目录的条件;取决于您的网站结构。
假设:
http://example.com/section/topic/sub
它转换为的URL将是:
http://example.com/index.php?a=section&b=topic&c=sub&d=
将在PHP
中显示为:
//var_dump($_GET);
array(4) {
["a"]=>
string(7) "section"
["b"]=>
string(5) "topic"
["c"]=>
string(3) "sub"
["d"]=>
string(0) ""
}