我们的网站运行在一个旧的Apache2示例上,它有一个很大的.htaccess
文件,用于将旧的URL重定向到新的URL。由于我们有很多相同的子URL,重定向如下所示:
RewriteRule ^(.*)old/url(.*)$ new/url [L,R=301]
这就像一个魅力。
例如,www.example.com/a/old/url
被重定向到www.example.com/a/new/url
,并且也为/b/
或/c/
工作。
在新的Apache(2.4.54)中,重定向不能按预期工作,因为它重定向如下:www.example.com/var/www/html/new/url
我做错了什么?为什么它把网站的基本路径放在前面?
我试着用谷歌搜索,但是什么都没找到。我想任何奇怪的路径,我不知道是设置在错误的方式。
我对.htaccess
不太了解,这使得它很难进行故障排除。
1条答案
按热度按时间z9ju0rcb1#
这就像一个魅力。
例如,
www.example.com/a/old/url
被重定向到www.example.com/a/new/url
,并且也为/b/
或/c/
工作。只有在配置文件中的其他位置也定义了
RewriteBase /a
指令时,它才会这样做。(虽然不清楚它如何在/b/
或/c/
上同样工作,除非您有其他指令可以帮助您。除非您的意思是它从/b/
或/c/
重定向到/a/
?在这种情况下,只有RewriteBase
指令才能使其工作。)在新的Apache(2.4.54)中,重定向不能按预期工作,因为它重定向如下:
www.example.com/var/www/html/new/url
个如果
RewriteBase
没有如上定义,则会发生这种情况。这适用于Apache 2.2和2.4。
然而,在一些情况下,也有可能
RewriteBase
是/曾经是在父配置中定义的,并且设置了RewriteOptions MergeBase
(它将设置传播到子配置)。(特别是2.2.23和更高版本)和Apache 2.4的早期版本(特别是从2.4.0到2.4.3)这实际上是默认的(可以说是有缺陷的)行为。所以,如果你从Apache的这些“有缺陷”的版本中升级,这可能是“刚刚工作”。RewriteBase
指令定义了相对替换字符串前缀的URL路径(new/url
是相对替换字符串)。如果没有定义RewriteBase
,则会添加回目录前缀(即.htaccess
文件所在的绝对文件路径)-这将导致格式错误的重定向。对于外部“重定向”,通常最好使用根目录相对(以斜杠开头)或绝对(scheme + hostname)替换字符串。例如:
上述内容不再依赖于
RewriteBase
指令,因为 substitution 字符串(即/a/new/url
)不再是 relative。然而,
^(.*)old/url(.*)$
与old/url
完全相同,这太笼统了。以上代码将
/a/old/url
、/b/old/url
或/c/old/url<anything>
重定向到/a/new/url
。或者,使用反向引用重定向到相同的URL路径(即
a
、b
或c
):在测试之前,您需要清除浏览器缓存,因为错误的301(永久)重定向将被浏览器缓存(可能还有任何中间缓存)。首先测试302(临时)重定向,以避免潜在的缓存问题。
参考: