Apache中多斜杠替换规则不生效的问题求助
Apache中多斜杠替换规则不生效的问题求助
大家好,我最近遇到了一个.htaccess重定向的棘手问题:我想把带有多个连续斜杠的URL(比如/about//////)重定向到正常的单斜杠URL(/about/),配置规则后在线测试工具显示一切正常,但实际运行时却完全没效果,这可把我愁坏了。
先给大家看看我最初的.htaccess配置:
RewriteEngine On RewriteBase / # 拦截TRACE、TRACK和DEBUG请求方法 RewriteCond %{REQUEST_METHOD} ^(DEBUG|TRACE|TRACK) [NC] RewriteRule ^(.*)$ - [F,L] # 试图替换多斜杠为单斜杠的规则 RewriteCond %{REQUEST_URI} \/{2,} RewriteRule \/{2,} / [R=302,L] # 前端路由的 fallback 规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php
我用测试工具模拟请求时,得到的反馈是这样的:
RewriteCond %{REQUEST_URI} /{2,}
这个条件已满足。RewriteRule /{2,} / [R=302,L]
新URL是https://site.ru/about/
测试停止,将以302状态码进行重定向
看起来规则应该完全生效才对,但实际访问/about//////的时候,却没有任何重定向反应,直接走了后面的前端路由规则。
后来我查了资料终于找到了解决方案,调整后的完整配置如下:
RewriteEngine On RewriteBase / # 拦截TRACE、TRACK和DEBUG请求方法 RewriteCond %{REQUEST_METHOD} ^(DEBUG|TRACE|TRACK) [NC] RewriteRule ^(.*)$ - [F,L] # 替换URL中的多斜杠为单个斜杠(修正后的规则) RewriteCond %{THE_REQUEST} \s//+(.*?)\s [NC] RewriteRule ^ /%1 [R=302,L] # 前端路由的 fallback 规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php
问题根源
原来Apache在处理请求时,会自动把REQUEST_URI里的多个连续斜杠压缩成单个斜杠,所以当我的规则去匹配REQUEST_URI时,实际上已经看不到那些多余的斜杠了,自然不会触发重定向。而THE_REQUEST变量保存的是客户端发送的原始请求行内容,里面的多斜杠不会被Apache修改,所以用它来匹配就能准确捕捉到带有多斜杠的请求。
备注:内容来源于stack exchange,提问作者Ihor
相关产品推荐
相关产品推荐

