You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 06:59:36