如何使用htaccess强制从特定网址中删除尾部斜杠,
例如:
https://blahblah.com/checkout/?checkout=add_to_cart&id=17&item_options[price_id]=1/
到
https://blahblah.com/checkout/?checkout=add_to_cart&id=17&item_options[price_id]=1
并忽略其他网址,例如https://blahblah.com/about/或https://blahblah.com/contact/等
答案 0 :(得分:1)
因为尾部斜杠是查询字符串的一部分,你不能只重写它,你必须提取查询字符串减去最后的/
,然后重定向到你所依赖的页面。匹配附加。
要执行此操作,您需要将RewriteCond中的模式与%1
匹配(请参阅this answer以供参考)并将其附加到%{REQUEST_URI}
(从而删除原始查询字符串) - 像这样:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)/$
RewriteRule ^.*$ %{REQUEST_URI}?%1 [L,R=301]
RewriteCond %{QUERY_STRING} ^(.*)/$
< - 确保您在条件结尾处获得了/
- 它确保仅重定向以/
结尾的查询字符串,你不会在一个可怕的递归循环中结束。
答案 1 :(得分:0)
你可以试试这个:
RewriteCond %{QUERY_STRING} (.*)/$
RewriteRule ^(.*)$ /$1?%1 [L,R=301]
这将仅重定向包含查询字符串的每个请求。在你的情况下:
checkout/?checkout=add_to_cart&id=17&item_options[price_id]=1/
到
checkout/?checkout=add_to_cart&id=17&item_options[price_id]=1
但不是https://blahblah.com/about/
和https://blahblah.com/contact/
答案 2 :(得分:0)
我建议尝试找出为什么首先开始使用尾随斜杠。正如CD001在评论中所说,可能是你的PHP代码做错了。
但是,如果您确实需要htaccess解决方案来删除斜杠,那么以下内容应该对您有用。
RewriteCond %{QUERY_STRING} ^(.*)/$
RewriteRule ^(.*)$ ?%1 [L,R=301]
此问题已在http://htaccess.madewithlove.be/进行了测试,适用于您的示例网址。
答案 3 :(得分:0)
如果你的意思是内部例程
RewriteCond %{QUERY_STRING} ^(checkout\=[^\&\s]+\&id\=\d+\&item_options\[price_id\]\=\d+)\/
RewriteRule ^ %{REQUEST_FILENAME}?%1 [L]