【问题标题】:RewriteCond and RewriteRule work fine except when not using pathsRewriteCond 和 RewriteRule 工作正常,除非不使用路径
【发布时间】:2021-10-24 08:05:23
【问题描述】:

我有一个新域,需要通过 Apache 中的代理加载旧域的内容。这已经很好了:

<VirtualHost myserver:80>
ServerName newdomain.com
ServerAlias www.newdomain.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^newdomain\.com$
RewriteRule ^(.*)$ https://olddomain.com/$1 [P]
</VirtualHost>

例如:

  • newdomain.com/contact 加载 olddomain.com/contact
  • newdomain.com/catalogue/342 加载 olddomain.com/catalogue/342

但是当我尝试这个时问题就来了:

  • newdomain.com(没有任何其他路径)。结果是 404 错误。

我几乎猜想问题出在RewriteCond / RewriteRule 定义中,但我似乎找不到问题所在。有任何想法吗?谢谢!

【问题讨论】:

  • 这些是您仅有的代理指令吗?请注意,这些来自 vHost:80,那么 vHost:443 呢?
  • @MrWhite SSL 仅通过 Cloudflare 处理。

标签: apache .htaccess mod-rewrite virtualhost


【解决方案1】:
RewriteRule ^(.*)$ https://olddomain.com/$1 [P]

因为此规则是在 virtualhost 上下文中定义的,所以 RewriteRule pattern 匹配的 URL 路径是相对于根的,并且以斜杠开头。由于这是在 substitution 字符串中捕获和使用的,因此它会在目标 URL 路径的开头产生一个双斜杠。

也许这会影响主页的路由。

请尝试以下方法:

RewriteRule ^/(.*)$ https://olddomain.com/$1 [P]

也不需要前面的RewriteCond 指令,因为您已经在newdomain.com 的vHost 中,并且当前的条件 省略了www.newdomain.com,这可能不是本意。


或者根本不使用 mod_rewrite,因为它似乎是直接的一对一代理。

例如,请改用以下内容。

ProxyPass / https://olddomain.com/
ProxyPassReverse / https://olddomain.com/

【讨论】:

  • 我稍后可能会尝试第二个解决方案,但您发布的第一个解决方案可以解决问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2016-09-17
相关资源
最近更新 更多