没有固定结构的 url 重写


Url-rewrite with no fixed structure

我有这个 3 个 url 类型:

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

"页面"总是在这里,但另外 2 个不是

如何让它每次都以这种方式工作?

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

如果最后 2 部分不在这里,请停止工作......

谢谢!

为此,您需要多个规则(您可以使用一个规则来做到这一点,但从可读性上讲,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 更改查询字符串时才有效 - 默认行为(当查询字符串未更改时)是追加原始查询字符串。

RewriteRule ^(.*)/(.*)$ $1.php?action=$2 [QSA,L]
RewriteRule ^(.*)$ $1.php [QSA,L]