在.htaccess中删除URL中的多个斜杠组

Mik*_*ike 0 apache .htaccess mod-rewrite slash trailing-slash

我目前有一个网站,客人可以使用任意数量的斜杠访问每个网址,以分隔文件夹名称.例如,如果URL应该是:

http://example.com/one/two/three/four
Run Code Online (Sandbox Code Playgroud)

然后,用户可以通过以下任何一种方式访问​​同一页面:

http://example.com/one//two///three////four/////
http://example.com/one/two////three/four/////
http://example.com///one///////////two////three/four/
http://example.com///////////one///////////two/three/four
Run Code Online (Sandbox Code Playgroud)

但是,我希望上面的示例网址仅将用户重定向到此网址:

http://example.com/one/two/three/four
Run Code Online (Sandbox Code Playgroud)

这是我的.htaccess文件,试图阻止巨大的斜杠:

RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule .* - [L]
RewriteRule ^(.*)/+$ /$1 [R=301,L,NC]
RewriteCond %{REQUEST_URI} ^/+(.*)/+$
RewriteRule .* /%1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

第三行成功停止长URL的尾部斜杠.第4行和第5行是我尝试在域名后立即停止斜杠,但这是不成功的.

我问这个问题的原因是因为我不希望谷歌抓住我的重复内容,并且在网站上有活跃的adsense,谷歌可能会扫描我访问的所有网址.

有没有RewriteCond/RewriteRule组合我可以用来剥去中间斜线或者它更复杂?

anu*_*ava 12

您可以使用此规则删除URL中任何位置的多个斜杠:

RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
Run Code Online (Sandbox Code Playgroud)

  • 例如`https://localhost///////////一个///////////两个//////////三个/四个////// /` 将在一次重定向中变为 `https://localhost/one/two/three/four/`。 (2认同)
  • @MarisB。减少多重斜杠的并不是“$0”反向引用本身。正如您所说,“$0”仅包含与模式匹配的整个字符串。在_directory_(或`.htaccess`)上下文中,`RewriteRule`_pattern_与映射到文件系统后的URL路径匹配。将请求映射到文件系统的过程减少了多重斜杠。相反,如果在 _server_ 或 _virtualhost_ 上下文中使用相同的指令则不起作用 - 在将请求映射到文件系统之前处理该指令(当多个斜杠尚未减少时)。 (2认同)