apache-mod_rewrite + mod_proxy 在暂存区中工作,在生产区中不工作([P] 选项被忽略)

apache-mod_rewrite + mod_proxy 在暂存区中工作,在生产区中不工作([P] 选项被忽略)

我已经在我的 Apache 虚拟主机中设置了重定向,为几个子域名提供服务 - 分别称为 a.example.com 和 b.example.com - 为 ruby​​ on rails 应用程序提供服务。

在我的虚拟主机配置文件中我有以下规则:

rewriteEngine on
rewriteRule proxy/(.+)$ http://news.example.com/$1 [P]

我的想法是,我可以执行http://a.example.com/proxy/news/a并获取的内容http://news.example.com/news/a,但在同一个子域内,因此 ajax 不认为我的 ajax 请求是跨域的 -有关此问题的更多信息

问题是,虽然它在我的暂存环境中运行良好,但在生产中却不能!

两台服务器都是 Ubuntu 服务器 10.04。Apache 来自标准 ubuntu 存储库,使用apt-get install

我对整个 /etc/apache2/ 目录进行了比较,唯一的区别是服务器名称。

如果我将最后一个选项改为 [L],就会出现重定向,因此我认为 mod_rewrite 正在运行。它只是没有与 mod_proxy 通信。

通过查看日志(/var/log/apache2和 rails 日志),似乎生产中的重写规则被忽略了——日志与没有重写规则时完全相同。

我该如何调试?我是否可以强制 Apache 向我提供更多信息,说明为什么在访问时未执行此特定规则/proxy

答案1

按照 larsks 的建议浏览 RewriteLog 后,我们意识到 Apache 确实在进行重定向 - 问题出在其他地方。

事实上,它是我们用来处理 ruby​​ 的模块 -Phusion 乘客

我们遇到了这样的情况:“天哪,服务器宕机了!”我们尝试设置乘客高性能变量为开启。

不幸的是,这个设置基本上意味着“忽略 mod_rewrite”:)

现在我们稍微调整了一下 - 它在所有位置都开启,除了以下列方式开始的情况/proxy

PassengerHighPerformance On
...
<location /proxy>
  PassengerHighPerformance Off
</location>

一旦我们将该配置选项添加到我们的虚拟主机配置文件中,一切就又开始正常工作了!

如果您通过 Google 来到这里并发现此内容有用,请为 Larsks 对 OP 的评论点赞。他的评论让我们走上了正确的道路。

相关内容