如何在Apache 2.4中去除URL中的双斜杠//?
我来帮你搞定这个URL多斜杠的问题!你遇到的情况其实挺常见的——Apache默认会内部把多斜杠当作单斜杠处理,但原始的请求URI还是会保留在$_SERVER变量里,而且不会主动触发重定向,所以得用Rewrite规则强制把带多斜杠的URL跳转到干净的单斜杠版本。
核心Rewrite规则(放在根目录的.htaccess里)
先确保你的Apache已经开启了Rewrite模块(在httpd.conf里确认LoadModule rewrite_module modules/mod_rewrite.so没有被注释),并且当前目录允许.htaccess生效(设置AllowOverride All)。然后把下面的规则加到根目录的.htaccess文件中:
RewriteEngine On # 处理域名后的多斜杠(比如 example.com////test.php → example.com/test.php) RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /+([^\ ]*) RewriteRule ^ /%1 [R=301,L] # 递归处理路径中的多斜杠(比如 example.com/path////to////test.php → example.com/path/to/test.php) RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=301,L]
规则解释
第一个规则:用
%{THE_REQUEST}变量是关键!这个变量存储的是用户发送的原始请求行(比如GET ////test.php HTTP/1.1),不会被Apache内部修改,所以能准确捕捉到用户输入的多斜杠。规则会把多斜杠开头的路径替换成单斜杠开头,然后返回301永久重定向。第二个规则:专门处理路径中间的多斜杠(比如目录之间的
////),它会递归地把所有连续的斜杠替换成单个斜杠,直到URL里没有多余的斜杠为止。
为什么之前的尝试可能没生效?
很多人会用%{REQUEST_URI}来匹配多斜杠,但Apache在内部处理请求时,已经把%{REQUEST_URI}里的多斜杠转换成单斜杠了,所以根本匹配不到原始的多斜杠请求。而%{THE_REQUEST}是原始的请求数据,不会被修改,所以能精准触发重定向。
测试验证
设置好规则后,访问example.com////test.php或者example.com/path////to/test.php,浏览器应该会自动跳转到对应的单斜杠URL,此时你再输出$_SERVER['REQUEST_URI'],就能看到干净的路径了,不会有多余的斜杠。
小贴士:测试阶段可以先用
R=302临时重定向,确认规则生效后再改成R=301永久重定向(对SEO更友好)。
内容的提问来源于stack exchange,提问作者Patrick Valibus

