我已经在我的 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 的评论点赞。他的评论让我们走上了正确的道路。