通过 .htaccess 从 URL 中删除双斜杠或更多斜杠时出现问题

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

我使用以下 htaccess 规则从 Web url 中删除双斜杠或更多斜杠:

#remove double/more slashes in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

这对于 uri 中间出现的斜杠来说效果很好,例如,如果使用 url:

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

它被重定向到正确的单斜杠网址:

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

但是,如果 url 开头包含双斜杠,就在域名之后,则它不起作用,例如:

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

它没有被重定向。

如何修复上述规则以适用于此类网址?谢谢。

.htaccess url slash
8个回答
21
投票

尝试一下:

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

它应该重定向到域末尾的单个斜杠。 以及对你的改进:

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

8
投票

对我来说,以下规则非常有效:

<IfModule mod_rewrite.c>
    RewriteBase /

    # rule 1: remove multiple leading slashes (directly after the TLD)
    RewriteCond %{THE_REQUEST} \s/{2,}
    RewriteRule (.*) $1 [R=301,L]

    # rule 2: remove multiple slashes in the requested path
    RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
    RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>

这个想法很大程度上基于 Marcels 的答案(谢谢!),但是这个更轻量级,并且包含

RewriteBase
,如果您使用特定的子目录结构,这可能会有所帮助。此外,马塞尔的回答缺乏解释,我想解决这个问题:

规则 1:

{THE_REQUEST}
包含类似
GET /index.html HTTP/1.1
的内容(请参阅 docs)。因此,如果我们匹配第一个空格 (
\s
) 后跟多个斜杠 (
/{2,}
),我们就可以通过
$1
访问正确的 URL,而无需前导双斜杠。

规则 2:正则表达式

^(.*)/{2,}(.*)$
将请求 URI 拆分为多个斜杠。
%1/%2
然后再次组合两个分割的字符串,但此时只有一个斜杠。


8
投票

按照这个 链接,下面的代码应该处理 URL 中额外的斜杠(任何地方)。

RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]

3
投票

为了防止网址中出现长时间重复的字符,例如:

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

你可以这样做:

RewriteCond %{REQUEST_METHOD}  !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]

它应该适用于:

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

另请参阅:.htaccess - 如何从网址中删除重复的字符?


2
投票

使用一小段 .htaccess 即可轻松解决这种情况。您需要做的就是复制以下代码和您网站的根

.htaccess
文件:

<IfModule mod_rewrite.c>
RewriteBase /
# Rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# Rule 2: remove multiple slashes in the requested path
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>

规则 1:

{THE_REQUEST}
包含类似
GET /index.html HTTP/1.1

的内容

因此,如果我们匹配第一个空格

(\s)
后跟多个斜杠
(/{2,})
,我们就可以通过
$1
访问正确的URL,而无需前导双斜杠。

规则 2: 正则表达式

^(.*)/{2,}(.*)$
将请求 URI 拆分为多个斜杠。
%1/%2
然后再次组合两个分割的字符串,但此时只有一个斜杠。

例如,该指令将重定向如下:

https://www.meysmahdavi.com// 重定向至 https://www.meysmahdavi.com/ https://www.meysmahdavi.com//blog-post/ 重定向至 https://www.meysmahdavi.com/blog-post/ https://www.meysmahdavi.com//path/directory/ 重定向至 https://www.meysmahdavi.com/path/directory/

所以基本上它会从任何 URL 中删除双斜杠。

来源:https://www.meysmahdavi.com/


0
投票

只需将以下代码放入您的 .htaccess 文件中。 它将从任何地方删除多个斜杠。位于网址末尾和网址中间。

<IfModule mod_rewrite.c>
RewriteBase /`enter code here`
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
#Remove slash anywhere from url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
# Rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# Rule 2: remove multiple slashes in the requested path`enter code here`
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>

0
投票

这里有一个细微的变化,我发现当你有一个 .htaccess 文件和许多子目录时效果更好:

# Remove multiple slashes anywhere in url

# rule 1: Remove multiple leading slashes directly after the domain name
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
 
# rule 2: Remove multiple slashes anywhere in the rest of the path
RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}([^\s]*)
RewriteRule ^ %1/%2 [R=301,L,NE]

0
投票

一次删除多个斜杠

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{THE_REQUEST} (\s/{2,}.*)|(\s/.+//.*)
RewriteRule (.*) $1 [QSA,R=301,L]
© www.soinside.com 2019 - 2024. All rights reserved.