2012-04-14 478 views
1

我們的本地開發設置需要在DMZ中有一個框,並且每個開發人員在它的apache配置中都有一行代理。看起來是這樣的:apache反向代理:如何轉發代理服務器的HTTP_HOST

ProxyPreserveHost on 

ProxyPass /user1/ {user1's IP} 
ProxyPassReverse /user1/ {user1's IP} 

ProxyPass /user2/ {user2's IP} 
ProxyPassReverse /user2/ {user2's IP} 

#etc 

我們的公共網址成爲了{DMZ server}/user1{DMZ server}/user2問題是,在開發的盒,$_SERVER['HTTP_HOST']值只是{DMZ server}沒有用戶的子目錄。期望的行爲是將/user%/作爲真正的主機名稱。

我試着重寫主機var和一些重寫規則,但沒有任何工作。

創建子域不是一個選項。

謝謝你的幫助!

+0

$ _SERVER ['HTTP_HOST']無論如何都只顯示主機名或IP地址。您需要使用$ _SERVER ['REQUEST_URI']或類似的東西來獲取完整路徑。 – 2012-04-18 02:10:00

+0

相信我,我查看了所有$ _SERVER的正確值。 Besies,我寧願不跑過我運行的所有項目,並更改代碼。我們使用的PHP框架也依賴於HTTP_HOST。 – Ethan 2012-04-18 11:55:58

+0

所以如果我正確地理解了這個問題,希望將{DMZ_SERVER}/user%傳遞給後端應用程序? – groodt 2012-04-24 19:34:11

回答

1

我要去採取防刺和建議如下:

SetEnvIf Host (.*) custom_host=$1 
RequestHeader set X-Custom-Host-Header "%{custom_host}e/%{REQUEST_URI}e/%{QUERY_STRING}e" 

這應該希望設置一個請求頭稱爲X-定製主機頭,然後可以皮卡PHP。如果你願意,你可以嘗試覆蓋主機頭,但我不確定這一點的含義。 Host頭是一個特殊的HTTP頭,通常只包含HTTP請求的主機部分,而不包含完整的請求url。

不幸的是,如果您可以更詳細地說明您要查找的內容,這將有所幫助。

+0

不幸的是,我不能通過代替'HTTP_HOST','SERVER_NAME','SCRIPT_URI'等實例的所有代碼。 – Ethan 2012-04-25 13:02:41

0

編輯,第三個答案:

看起來像Apache之前已經聽說過這宗投訴,解決的辦法是mod_substitute。您需要使用它來重寫文檔中返回的所有URL以插入/user1/

編輯,第二個答案:

根據您的意見的附加信息,我會說你的DMZ服務器上的Apache配置是正確的。您要求的是讓開發人員機器生成包含其上下文路徑的URL(這是類似於您的/user1/位的J2EE術語)。我沒有任何PHP經驗,所以我不知道它是否有這樣的設施,但快速搜索suggests it does not

否則,您必須推出自己的函數,將相對URL轉換爲絕對URL,將其設置爲可配置,以便您可以將其添加到主機名,然後強制所有人將該函數專用於生成網址。有關指導,請參閱this old (outdated?) PHP best practices article中的「使您的應用程序位置無關」,以獲取有關查找本地文件相關問題的解決方案。

以前的答案:(不工作,導致重定向循環)

我還不清楚是什麼你正在嘗試做的,或者你的意思是「運行的應用程序開發是Apache和PHP爲主,託管各種應用」,但作爲一個受過教育的猜測,你有沒有嘗試過:

ProxyPass /user1/ {user1's IP}/user1/ 
ProxyPassReverse /user1/ {user1's IP}/user1/ 

如果我建立的那種環境,你似乎是希望有,我想$_SERVER['HTTP_HOST']是每{DMZ server} dev機器,這樣開發機器的環境看起來就像(或者至少更類似於)生產到運行的代碼一樣它。

+0

這實際上導致了我的重定向循環。 – Ethan 2012-04-25 13:07:22

+0

我們的目標是爲每個開發人員提供一個唯一的公開網址,該網址可正確轉發到他們的機器。這就是它。當PHP需要構造一個URL(例如圖像)時,它使用$ _SERVER ['SERVER_NAME']或'HTTP_HOST',在這種情況下這是不正確的。子域名將是完美的,我想。 – Ethan 2012-04-25 13:09:40

+0

@Enghan,子域名是理想的。在J2EE中你所做的事很容易,因爲它具有應用程序上下文的概念,並且你構建的URL不是相對於主機名而是相對於上下文的,這在你的情況下將是主機名加'/ user1 /'。我不知道PHP服務器和應用程序是如何設置的。原則上,我會編寫一個函數,將相對URL轉換爲絕對URL,將其設置爲可配置,以便您可以將其添加到主機名,然後強制所有人將該函數專門用於生成URL。 – 2012-04-25 17:25:21