.htaccess添加了/var/www/html

u59ebvdq  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(140)

我们的网站运行在一个旧的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不太了解,这使得它很难进行故障排除。

z9ju0rcb

z9ju0rcb1#

RewriteRule ^(.*)old/url(.*)$ new/url [L,R=301]

这就像一个魅力。
例如,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)替换字符串。例如:

RewriteRule ^(.*)old/url(.*)$ /a/new/url [L,R=301]

上述内容不再依赖于RewriteBase指令,因为 substitution 字符串(即/a/new/url)不再是 relative
然而,^(.*)old/url(.*)$old/url完全相同,这太笼统了。

RewriteRule ^(a|b|c)/old/url /a/new/url [L,R=301]

以上代码将/a/old/url/b/old/url/c/old/url<anything>重定向到/a/new/url
或者,使用反向引用重定向到相同的URL路径(即abc):

RewriteRule ^(a|b|c)/old/url /$1/new/url [L,R=301]

在测试之前,您需要清除浏览器缓存,因为错误的301(永久)重定向将被浏览器缓存(可能还有任何中间缓存)。首先测试302(临时)重定向,以避免潜在的缓存问题。

参考:

  • https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritebase
  • https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriteoptions
  • https://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

相关问题