由于移动了网站,旧的主机创建了一个重定向到新位置。但是,重定向中存在一个前导斜杠/
,前托管服务商无法/不愿意修复它。所以我最终得到了所有重定向:
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是否会以某种方式区别对待这种情况?
如何摆脱其中一个主流斜杠?
答案 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
不同,您需要指定两个斜杠。
令人困惑,但这就是它的运作方式。