我有这 3 个 url 类型:
- site.com/page
- site.com/page/action
- site.com/page/action?params
“页面”总是在这里,但另外 2 个不在
如何让它每次都以这种方式工作?
RewriteRule ^(.*)/(.*)?(.*)$ $1.php?action=$2&$3
有了这个,如果最后两个部分不在这里,请停止工作...
谢谢!
我有这 3 个 url 类型:
“页面”总是在这里,但另外 2 个不在
如何让它每次都以这种方式工作?
RewriteRule ^(.*)/(.*)?(.*)$ $1.php?action=$2&$3
有了这个,如果最后两个部分不在这里,请停止工作...
谢谢!
RewriteRule ^(.*)/(.*)$ $1.php?action=$2 [QSA,L]
RewriteRule ^(.*)$ $1.php [QSA,L]
为此,您将需要多个规则(您可以使用一个规则来完成,但从可读性角度来看,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 更改查询字符串时才有效 - 默认行为(当查询字符串未更改时)是附加原始查询字符串。