Url重写没有固定的结构

时间:2013-10-23 13:43:34

标签: php url-rewriting

我有这3个网址类型:

  • site.com/page
  • site.com/page/action
  • site.com/page/action?params

“页面”总是在这里,但另外两个不是

每次都能以这种方式运作?

RewriteRule ^(.*)/(.*)?(.*)$ $1.php?action=$2&$3

对于这个,如果最后两部分不在这里,停止工作......

谢谢!

2 个答案:

答案 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改变查询字符串时有效 - 默认行为(当查询字符串未被更改时)是附加原始查询字符串。