0

我有这 3 个 url 类型:

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

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

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

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

有了这个,如果最后两个部分不在这里,请停止工作...

谢谢!

4

2 回答 2

1
RewriteRule ^(.*)/(.*)$ $1.php?action=$2 [QSA,L]
RewriteRule ^(.*)$ $1.php [QSA,L]
于 2013-10-23T13:45:22.407 回答
1

为此,您将需要多个规则(您可以使用一个规则来完成,但从可读性角度来看,2 会更好。

首先,忘记查询字符串。您没有对其进行操作,并且该[QSA]标志可以完成将其附加到结果 URL 的工作。

您现在需要两条规则,一条处理“action”变体,一条只处理页面名称:

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.

请注意,该QSA标志仅适用于第二条规则。这是因为它仅在重写的 URI 更改查询字符串时才有效 - 默认行为(当查询字符串未更改时)是附加原始查询字符串。

于 2013-10-23T13:52:48.687 回答