我有这3个网址类型:
“页面”总是在这里,但另外两个不是
每次都能以这种方式运作?
RewriteRule ^(.*)/(.*)?(.*)$ $1.php?action=$2&$3
对于这个,如果最后两部分不在这里,停止工作......
谢谢!
答案 0 :(得分:1)
RewriteRule ^(.*)/(.*)$ $1.php?action=$2 [QSA,L]
RewriteRule ^(.*)$ $1.php [QSA,L]
答案 1 :(得分:1)
你需要一个以上的规则(你可以用一个但是可读性,2个会更好。
首先,忘记查询字符串。您没有操纵它,[QSA]
标志可以将结果附加到生成的URL。
您现在需要两个规则,一个用于处理“操作”变体,另一个用于处理页面名称:
RewriteRule ^[^/]+$ $0.php [L]
RewriteRule ^([^/]+)/([^/]+) $1.php?action=$2 [L,QSA]
然而,这将导致重写循环。 mod_rewrite的工作方式意味着规则几乎总是至少执行两次,而在第二次(以及所有后续)迭代中,第一条规则将与重写的URL匹配。
所以我们需要更具体一点:
RewriteRule ^(?:(?!\.php$)[^/])+$ $0.php [L]
RewriteRule ^([^/]+)/([^/]+)$ $1.php?action=$2 [L,QSA]
此前瞻将确保第一条规则仅匹配不以.php
结尾的URI。
请注意,QSA
标志仅适用于第二条规则。这是因为它只在重写的URI改变查询字符串时有效 - 默认行为(当查询字符串未被更改时)是附加原始查询字符串。