幫助我了解如何使用 ProxyPass
更新:在玩了下面兩個答案後,我添加了一個修改後的問題。
你好呀,
如果您正在閱讀本文,您可能熟悉 Apache 的 mod_proxy 及其 ProxyPass 函式。像許多其他人一樣,我有一個可以從內部網路外部訪問的應用程序的問題,但是該應用程序本身會訪問不同機器上的其他內部應用程序,並且當您使用此設置進行遠端訪問時,事情就會變得不穩定。
所以,我的設置很簡單,我有:
機器 #1 啟用了遠端訪問,我通過主機名訪問它,它吐出執行在其上的 PHP 應用程序。
機器 #2 是一個執行 Django 的新應用程序,它使用完全不同的後端(甚至是身份驗證),它託管在單獨的機器上。在我們的 Intranet 中,我們通過一個簡單的命名主機名訪問它,該主機名基本上鍊接到內部 192.168.0.101 ip。
我嘗試使用 ProxyPass 進行設置,例如,傳遞到 /new 會將其發送到新應用程序:
ProxyPass /new http://192.168.0.101/
這種工作,它獲取到另一個應用程序的請求,但它中斷了,因為我的 Django 應用程序想要重定向到 /auth/login/,它立即無法辨識。如果我自己將 url 修改為 foo.net/new/auth/login 我會得到我的登錄頁面,但你可以猜到在整個瀏覽過程中這樣做並不方便。
那麼我怎樣才能讓 ProxyPass 按我的意願工作呢?我是否需要對 Apache 做一些事情,所以它總是在另一個應用程序中的 url 之前寫 /new,或者這是我應該在我的 Django 應用程序中修改的東西?
任何提示和指示也將不勝感激。謝謝你的時間
您應該修改您的 django 應用程序,使其位於 /new/auth/login 而不是 /auth/login。通常,您的代理通行證應如下所示:
ProxyPass /path http://192.168.0.101/path ProxyPassReverse /path http://192.168.0.101/path
這與您期望位於 /new/ 的 Django 應用程序相結合,應該可以解決您的問題。
使用虛擬主機。例如,將您的伺服器的 A 名稱(例如sub.external.com)設置為您的伺服器 IP(例如123.456.678)
出於安全考慮,如果在settings.py中使用 ProxyPass,您需要根據Ticket #6880顯式轉發 HTTP_HOST :
USE_X_FORWARDED_HOST = True
然後將以下內容添加到 Apache /etc/httpd/httpd.conf:
# Virtual hosts Include /etc/httpd/extra/httpd-vhosts.conf
將您的 VirtualHost 添加到**/etc/httpd/extra/httpd-vhosts.conf**:
NameVirtualHosts *:80 <VirtualHost *:80> ServerName sub.external.com ProxyPass / http://127.0.0.1:8000/ </VirtualHost>
現在,您可以從http://sub.external.com訪問您的網站,而不必擔心“路徑”