通过 .htaccess 从 URL 中删除双斜杠不起作用

Removing Double Slashes From URL By .htaccess does not work

为什么 none 这些解决方案可以在我的 Apache 服务器上运行:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*)  [R=302,L]

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]

我尝试过的其他方法。

我尝试了此页面中的所有解决方案:Issue In Removing Double Or More Slashes From URL By .htaccess

以及其他页面。

问题是 htaccess 中的规则与上述模式中的双斜杠不匹配。

我还尝试了“文字”模式,使用精确的 urls 而没有正则表达式模式。依然没有。但是用一个斜线 - 所有的工作。

Apache 发现时似乎有问题:“//”- url 显然无法识别,规则被忽略。

想法很简单:摆脱双斜杠并用一个斜杠代替它们:

 http://demo.codesamplez.com/html5//audio -> http://demo.codesamplez.com/html5/audio

你知道如何用双斜杠“//”将 URL 重定向到单个单行“/”吗?

这里是 htaccess(删除了文件中最长的注释):

<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On


RewriteCond %{REQUEST_URI} ^/test//slash
RewriteRule ^(.*)$ /test/slash [R=302,L]


RewriteCond %{REQUEST_URI}:: ^(/.+)/(.*)::$
RewriteRule ^(.*) - [E=BASE:%1]

# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/ [R=301,L]

# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# Rewrite all other queries to the front controller.
RewriteRule ^ %{ENV:BASE}/app.php [L]
</IfModule>

尝试以下操作,靠近根 .htaccess 文件的顶部,在任何现有重写之前:

# Remove multiple slashes anywhere in the URL-path
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule (.*) / [R=302,L]

这利用了 RewriteRule 模式 匹配的 URL-path 中已经减少了多个斜杠的事实。并且针对 THE_REQUEST 的检查(其中包含请求的第一行 headers 并且 在整个请求 中没有改变)确保多个斜线最初出现在某处URL-path(不包括查询字符串)。

另一个潜在的问题是,如果您的应用程序 (Apache) 服务器前面有一个代理服务器(或负载平衡器),这可能会规范化请求(减少多个斜杠,删除尾随 space,等等) 因为它将请求转发到您的应用程序 (Apache) 服务器。然后应用程序服务器永远不会看到您在浏览器中看到的原始请求(带有多个斜线)。


查看您的尝试...

RewriteCond %{REQUEST_URI} ^/test//slash
RewriteRule ^(.*)$ /test/slash [R=302,L]

这个“应该”工作,发布的有限示例。然而,REQUEST_URI 服务器变量在整个请求中被修改,因此如果 URL 已经被修改(可能在服务器配置中)那么这可能不匹配。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*)  [R=302,L]

这仅匹配 URL-path 的 start 处的多个斜杠,而不匹配 URL-path 中的任何位置。如果在 .htaccess 中使用,这也会导致格式错误的重定向(除非您还设置了 RewriteBase 指令)。如果 substitution 字符串上没有斜杠前缀,则此规则可能适用于 servervirtualhost 上下文,不是 .htaccess.

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=302,L]

与上述使用 REQUEST_URI 的问题相同。否则,这应该有效。但是,如果存在多于一组的多个斜杠,则会导致多次重定向。例如。 //foo//bar.

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=302,L]

与上面相同,只是只匹配双斜杠,而不是两个或多个斜杠的组。因此,如果一个组中有两个以上的斜杠,则会导致多次重定向。