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

问题描述 投票:0回答:1

为什么这些解决方案都不适用于我的 Apache 服务器:

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

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

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

我尝试过的其他方法。

我尝试了此页面中的所有解决方案:通过 .htaccess 从 URL 中删除双斜杠或更多斜杠时出现问题

以及其他页面。

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

我还尝试了“文字”模式,具有精确的 url,没有正则表达式模式。依然没有。但只需一个斜杠 - 一切工作。

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}::$1 ^(/.+)/(.*)::\2$
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}/$1 [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 url apache2 slash
1个回答
4
投票

在任何现有重写之前,请在根

.htaccess
文件顶部附近尝试以下操作:

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

这利用了以下事实:在与

RewriteRule
pattern 匹配的 URL 路径中已经减少了多个斜杠(这就是为什么您无法使用
RewriteRule
pattern 匹配双斜杠的原因)。对
THE_REQUEST
(包含请求标头的第一行并且在整个请求中不会更改)的检查可确保 URL 路径中的某个位置最初存在多个斜杠(不包括查询字符串)。

另一个潜在的问题是,如果您的应用程序 (Apache) 服务器前面有一个代理服务器(或负载均衡器),这可能会在将请求转发到您的服务器时规范化请求(减少多个斜杠、删除尾部空格等)。应用程序(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 ^(.*) $1 [R=302,L]

这只匹配 URL 路径的

start 处的多个斜杠,而不是 URL 路径中的任何位置。如果在 .htaccess

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

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

与上面提到的使用

REQUEST_URI

有同样的问题。否则,这应该有效。但是,如果存在多于 1 组的多个斜杠,则会导致多个重定向。例如。 
//foo//bar

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

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

© www.soinside.com 2019 - 2024. All rights reserved.