我喜欢在 URL 末尾强制使用结束斜杠,我在 .htaccess 文件中执行以下操作:
#append slash at end of URLs
RewriteCond %{REQUEST_URI} !(/$|\.|^$)
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
但是,如果我碰巧在查询字符串中放置了一些内容,例如:
,这会导致问题https://www.mywebsite.com/regular/path/page=22/
如何修改此重写,以便在可见 URL 中没有等号 (=) 时仅附加此结尾斜杠,这样我就可以得到以下结果:
https://www.mywebsite.com/regular/path/page=22
进一步澄清(谢谢@arkascha): 我认为这需要用
%{THE_REQUEST}
来完成,因为幕后总会有一个查询字符串。 实际上,我使用更复杂的重写规则将复杂的查询字符串映射为看起来更用户友好的内容。 我的真实网址是这样工作的:
https://www.mywebsite.com/CustomerSlug/Php-File-Name/action/filter=all
RewriteRule ^([A-Za-z]+)/([A-Za-z\-]+)/([A-Za-z0-9]+)/(.+) /$2.php?CustomerSlug=$1&action=$3&$4 [NC,L]
这些 URL 中的任何一个都很棒(请注意,前两个 URL 不以斜杠结尾)...当最终位置有某些内容时,我只需要跳过结尾斜杠,因为它会作为 URL 的一部分被拾取查询字符串中的变量值
https://www.mywebsite.com/CustomerSlug/Php-File-Name/action/filter=all&value=4&color=blue
https://www.mywebsite.com/CustomerSlug/Php-File-Name/action/filter=all
https://www.mywebsite.com/CustomerSlug/Php-File-Name/action/
https://www.mywebsite.com/CustomerSlug/Php-File-Name/
https://www.mywebsite.com/CustomerSlug/
https://www.mywebsite.com/
那么,您需要测试请求的 URL 是否有查询字符串。这可能是一个简单的方法:
#append slash at end of URLs
RewriteEngine on
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{REQUEST_URI} !(/$|\.|^$)
RewriteRule ^ %{REQUEST_URI}/ [R=301,L,QSA]
如果查询字符串中有任何内容,这将阻止应用
RewriteRule
。请注意,这并不完全是“如果有问号”,查询字符串可能为空,但问号可能已添加。是否发送是请求客户端(浏览器)的问题,因此没有可靠的方法来确定这一点。无论如何,这都是毫无意义的,所以我想说你可以放心地忽略这种情况。如果您do想要走这条路,则必须针对%{THE_REQUEST}
变量进行测试。有关详细信息,请参阅文档。
但是我想知道如果有查询字符串,为什么您不需要尾随斜杠。在我看来,这打破了逻辑。
还有对现有
RewriteCond
的提示:请记住,%{REQUEST_URI}
始终包含所请求 URL 的 absolute 路径。所以它永远不会为空,它总是包含一个尾部斜杠。这就是为什么模式中的最后一个选项 (^$
) 永远不会匹配。