在URL路径的开头删除双斜杠

时间:2014-07-02 08:05:55

标签: apache .htaccess mod-rewrite

由于移动了网站,旧的主机创建了一个重定向到新位置。但是,重定向中存在一个前导斜杠/,前托管服务商无法/不愿意修复它。所以我最终得到了所有重定向:

http://sub.domain.com//path/to/file.html

所以我试图删除前导斜杠:

  • 使用mod_alias

    RedirectMatch 301 ^//(.*)$ http://sub.domain.com/$1
    
  • 使用mod_rewrite

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

两者都不起作用。后者删除路径中的多个斜杠,但不在开头。

已经有关于删除斜杠的问题,但它们无法解决此问题:

Apache是​​否会以某种方式区别对待这种情况?

如何摆脱其中一个主流斜杠?

3 个答案:

答案 0 :(得分:1)

问题

重点是Apache 2在请求的URI中不包含前导斜杠,所以你不能这样做:

RewriteRule ^/+(.*)$ /$1 [R=301,L]

或那:

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

任何其他类型的重定向或重写都可以使用。

解决方案

但你可以做的是使用通常如下所示的 Apache 请求变量: GET /some-page HTTP/1.1

考虑到这一点,我们可以做到以下几点:

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

所以所有主要的斜杠都将减少到我们需要的斜杠。

我在apache 2.4上测试了这个正面

答案 1 :(得分:0)

此代码适用于我

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}([^\s]*)
RewriteRule ^ %1/%2 [R=301,L,NE]

答案 2 :(得分:-2)

第一个/是隐含的

试试这个:

RewriteEngine on
RewriteRule ^/(.+) $1 [R=301,L,B,NE]

<强>为什么吗

要匹配路径开头的两个斜杠,在htaccess中,我们不需要查找两个斜杠 - 只需一个 - 因为假设第一个斜杠。例如,如果您想匹配example.com/pasta,则匹配规则为^pasta$,而不是^/pasta(仅在example.com//pasta上匹配)。

这与httpd.conf不同,您需要指定两个斜杠。

令人困惑,但这就是它的运作方式。