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 請求不是跨域的 -有關此 SO question 的更多資訊。問題是,雖然它在我的暫存環境中執行良好,但在生產環境中卻不行!
兩台伺服器都是 Ubuntu 伺服器 10.04 。Apache 來自標準的 ubuntu 儲存庫,使用
apt-get install
.我對整個 /etc/apache2/ 目錄進行了比較,唯一的區別是伺服器名稱。
如果我將最後一個選項更改為
$$ L $$,我得到一個重定向,所以這讓我認為 mod_rewrite 正在工作。它只是不與 mod_proxy 對話。 通過查看日誌(
/var/log/apache2
和 rails 日誌),似乎生產中的重寫規則只是被忽略了 - 日誌與它不存在時完全相同。我該如何調試呢?我可以強制 Apache 向我提供更多資訊,說明為什麼在我訪問時不執行此特定規則
/proxy
嗎?
在按照 larsks 的建議瀏覽 RewriteLog 之後,我們意識到 Apache 確實在進行重定向 - 問題出在其他地方。
事實上,它就是我們用來處理 ruby 的模組 - Phusion Passenger。
我們有一個“天哪,伺服器宕機了!” 我們嘗試將PassengerHighPerformance變數設置為on。
不幸的是,這個設置基本上意味著“忽略 mod_rewrite”:)
現在我們對它進行了一些調整 - 它在所有位置都打開,除了它們從以下位置開始時
/proxy
:PassengerHighPerformance On ... <location /proxy> PassengerHighPerformance Off </location>
一旦我們將該配置選項添加到我們的虛擬主機配置文件中,事情又開始工作了!
如果您通過 google 來到這裡並發現這很有用,請支持 Larsks 對 OP 的評論。他的評論使我們走上了正軌。