如何修改mod_rewrite规则:URL末尾加斜杠但含等号时除外
条件化添加URL末尾斜杠的.htaccess规则修改方案
问题场景
当前使用以下规则强制给URL末尾添加斜杠:
#append slash at end of URLs RewriteCond %{REQUEST_URI} !(/$|\.|^$) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
但遇到包含=(模拟查询字符串结构)的URL时会错误添加斜杠,比如生成https://www.mywebsite.com/regular/path/page=22/,需要调整规则,仅当**浏览器可见URL中不含=**时才添加末尾斜杠,正确结果应为https://www.mywebsite.com/regular/path/page=22。
补充背景:实际项目中用了友好URL重写,将查询字符串映射为路径形式,规则如下:
RewriteRule ^([A-Za-z]+)/([A-Za-z\-]+)/([A-Za-z0-9]+)/(.+) /$2.php?CustomerSlug=$1&action=$3&$4 [NC,L]
由于后台始终存在查询字符串,必须通过%{THE_REQUEST}判断用户可见的原始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不含=且未以斜杠/点结尾时,添加末尾斜杠 RewriteCond %{THE_REQUEST} !\= RewriteCond %{REQUEST_URI} !(/$|\.|^$) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
规则解释
RewriteCond %{THE_REQUEST} !\=:%{THE_REQUEST}存储的是用户浏览器地址栏中实际输入的原始请求URL,这个条件会跳过所有包含=的URL,避免给带查询字符串结构的路径添加斜杠。- 保留原条件
RewriteCond %{REQUEST_URI} !(/$|\.|^$):排除已以斜杠结尾、包含文件扩展名(如.php/.html)或空请求的情况,防止不必要的重写操作。
内容的提问来源于stack exchange,提问作者techtheatre
相关产品推荐
相关产品推荐

