8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Michiel 1月前

15 0

为什么这些解决方案都无法在我的 Apache 服务器上工作:RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s/{2,} [NC]RewriteRule ^(.*) $1 [R=302,L]orRewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$

为什么这些解决方案都不适用于我的 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 中的规则与上述模式中的双斜杠不匹配。

我还尝试了 \'literal\' 模式,使用精确的 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>
帖子版权声明 1、本帖标题:通过 .htaccess 删除 URL 中的双斜杠不起作用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Michiel在本站《.htaccess》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我在编辑的问题中包含了 .htacccess,只是删除了长注释。这是一个非常简单且标准的文件,但是我也在另一台服务器上尝试过,但那里的 .htaccess 太大了,所以我决定保持简单 - 上述规则在这些服务器上都不起作用。如您所见,即使使用简单的文字模式,它也不起作用:RewriteCond %{REQUEST_URI} ^/test//slash

  • 您使用的是哪个版本的 Apache?您的应用程序 (Apache) 服务器前面是否有代理服务器/负载平衡器?

  • 在任何现有重写之前, .htaccess 尝试在根文件顶部附近执行以下操作

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

    模式 RewriteRule 匹配的 URL 路径中多个斜杠已被缩减 (这就是为什么您无法使用 RewriteRule 模式 )。 而检查 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 路径 开头 .htaccess (除非您还设置了 RewriteBase 替换 中没有斜杠前缀, 此规则可能适用于 服务器 虚拟主机 上下文,而不是 .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]
    

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

返回
作者最近主题: