Apache-2.2

通過 htaccess/apache 代理對子域的所有請求到一個 ip

  • March 18, 2012

假設我有以下具有自己的文件根等的子域:

monad2.mysite.com

我希望所有請求都代理到一個 IP(例如193.159.3.129),但它們必須通過伺服器mysite.com(假設monad2在同一台伺服器上)。

我有以下(htaccess)配置,它適用於子域,但無法代理任何其他請求……

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://193.159.3.129/$1 [P]

我的問題是,雖然它適用於http://monad2.mysite.com/a.php(url 保持不變),但它不適用於( http://monad2.mysite.com/a/burl 轉換為http://193.159.3.129/a/b)之類的請求。請注意,後一個地址顯示了代理伺服器的目錄列表,這是正確的,只是子域更改為 ip。

另外,我認為這個系統肯定不適用於 HTTPS 請求,對嗎?

**編輯:**經過更多的故障排除後,我確切地找到了問題的發生時間。每當我嘗試訪問沒有最後斜線的目錄時,代理就會失敗,我最終會得到一個 IP。一些例子:

Original                        | Result
--------------------------------+--------------------------------
http://monad2.mysite.com        | http://monad2.mysite.com
http://monad2.mysite.com/a/     | http://monad2.mysite.com/a/
http://monad2.mysite.com/a      | http://193.159.3.129/a/           <- !
http://monad2.mysite.com/a.php  | http://monad2.mysite.com/a.php

您需要ProxyPassReverse- 它擷取Location響應標頭中的欄位並更改它們,以便客戶端將繼續與代理對話,而不是與後端伺服器對話。

ProxyPass並且ProxyPassReverse不能在.htaccess文件中 - 所以用這個替換你目前的重寫規則,它應該進入你<VirtualHost>的子域塊:

ProxyPass / http://193.159.3.129/
ProxyPassReverse / http://193.159.3.129/

.htaccess順便說一句:在可以避免的情況下不要使用。查看有關此事的 Apache 文件

通常,當您無權訪問主伺服器配置文件時,您應該只使用 .htaccess 文件。

引用自:https://serverfault.com/questions/370742