两个重写规则不合作

时间:2013-08-07 23:52:34

标签: .htaccess mod-rewrite

我想在一个网站上重写两件事。

mysite.com/something -> mystie.com/index.php?s=something

mysite.com/something/another -> mysite.com/index.php?s=something&d=another

这是我的htaccess

RewriteEngine on
RewriteRule ^(.+)$ index.php?s=$1 [L,QSA]
RewriteRule ^(.+)/(.+)$ index.php?s=$1&d=$2 [L,QSA]

另外两者都有效,但他们没有......

3 个答案:

答案 0 :(得分:1)

我猜测问题是你在第一条规则中匹配'/'字符。最简单的解决方案不是简单地在规则中添加字符类,例如:

RewriteRule ^([a-z0-9]+)$ index.php?s=$1 [L,QSA]
RewriteRule ^([a-z0-9]+)/([a-z0-9]+)$ index.php?s=$1&d=$2 [L,QSA]

或只是改变规则的顺序:

RewriteRule ^(.+)/(.+)$ index.php?s=$1&d=$2 [L,QSA]
RewriteRule ^(.+)$ index.php?s=$1 [L,QSA]

答案 1 :(得分:0)

颠倒这两条规则。重写引擎按顺序逐行遍历文件。你有第一条规则:

RewriteRule ^(。+)$ index.php?s = $ 1 [L,QSA]

匹配具有两个名称值对的url,因此文件在第一次匹配后停止处理,因为您使用的是L标志。

RewriteRule ^(.+)/(.+)$ index.php?s=$1&d=$2 [L,QSA]
RewriteRule ^(.+)$ index.php?s=$1 [L,QSA]

我没时间为你测试一下,对不起。但我强烈地感到这是问题所在。当我写这个答案的时候,有人提出了相同的建议。我想删除我的答案,但想确保你了解L标志,并按顺序处理文件。

答案 2 :(得分:0)

RewriteEngine on
RewriteRule ^([a-z0-9]+)$ index.php?s=$1 [L,QSA]
RewriteRule ^([A-Za-z0-9]+)/(.+)$ index.php?s=$1&d=$2 [L,QSA]

这很有效。改变订单不起作用。我也忘了添加

mysite.com/something/another

another字符串可以像asd-1231-ASDwqda。