【问题标题】:Remove double slash at the begining of URL path删除 URL 路径开头的双斜杠
【发布时间】:2014-08-22 22:35:01
【问题描述】:

由于网站移动,旧主机创建了一个重定向到新位置。但是,重定向中有一个前导斜杠/,并且前主机无法/愿意修复它。所以我最终得到的所有重定向都是这样的:

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 是否以某种不同的方式处理这种情况?

如何去掉前面的斜线之一?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    这段代码对我有用

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

    【讨论】:

      【解决方案2】:

      问题

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

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

      或者那个:

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

      对任何其他类型的重定向或重写都有效。

      解决方案

      但是你可以做的是使用 the Apache request 变量,它通常看起来像这样: GET /some-page HTTP/1.1

      考虑到这一点,我们可以执行以下操作:

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

      因此,所有前导斜杠都将减少到我们需要的那个。

      我在 apache 2.4 上测试了这个结果

      【讨论】:

        【解决方案3】:

        第一个/ 是隐含的

        试试这个:

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

        为什么?

        要匹配路径开头的两个斜杠,在htaccess 中,我们不需要寻找两个斜杠——只需一个——因为假定了第一个斜杠。例如,如果你想匹配example.com/pasta,你的匹配规则是^pasta$,而不是^/pasta(它只会匹配example.com//pasta)。

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

        令人困惑,但这就是它的工作原理。

        【讨论】:

        • 感谢您的帮助,但它不起作用......这有点令人沮丧,因为我无权访问访问日志......它仍然没有删除前导斜杠。这不仅仅是浏览器的问题,curl 表明没有发生重定向......
        猜你喜欢
        • 2016-09-28
        • 2019-06-19
        • 2016-08-07
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 2012-01-05
        • 1970-01-01
        相关资源
        最近更新 更多