
我正在嘗試設定兩個子網域, fora
和b
in domain.com
。我使用兩個 .conf 文件,根據 ServerName 和 ProxyPass 的更改,它們看起來幾乎相同:
<VirtualHost *:80>
ServerName a.domain.com #This was added as a try for a fix.
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/a
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
ProxyPass / https://a.domain.com:8444/
ProxyPassReverse / https://a.domain.com:8444/
ProxyPass /a/ https://a.domain.com:8444/
ProxyPassReverse /a/ https://a.domain.com:8444/
ProxyPass /b/ https://b.domain.com:8445/
ProxyPassReverse /b/ https://b.domain.com:8445/
</VirtualHost>
這是在我的測試環境中完成的,複製了與目前生產中類似的內容。在 /etc/hosts 中,我將a.domain.com
和添加b.domain.com
到 127.0.0.1。生產中的 DNS 記錄了“what”a.domain.com
和b.domain.com
“are”,它們是相同的 IP(我也在測試的機器上執行了此操作)。
另請注意,我不提供其根目錄中的任何內容。我補充說,試圖解決標題中所述的問題。不過,兩個目錄中都有一個簡單的 html。
實際問題是什麼?
簡單地說,當嘗試時a.domain.com
,結果是來自 的 webapp localhost:8444
,正如預期的那樣。嘗試的時候b.domain.com
,結果也是localhost:8444
,而不是localhost:8445
。a.conf
和都已b.conf
啟用,如果我停用a.conf
,那麼我正確地得到localhost:8445
。如果我也嘗試這樣做a.domain.com/b
,重定向將解析回a.domain.com
.
我已經閱讀了幾個問題和教程,其中大多數要么在我的配置中工作,要么添加 NameVirtualHost,據我所知,我的 Apache 版本不需要它。我還在連接埠 80 中新增了一個 ServerName,因為我認為也許請求b
是匹配的,a.conf
因為它們是相同的 IP,但這也不起作用。
我在這裡缺少什麼?我似乎忽略了 mod_proxy 的問題嗎?如果可能的話,我想為每個網路應用程式保留一個檔案。謝謝!
這是在 Ubuntu 18.04.2、Apache 2.4(mod_proxy 和 mod_ssl)、Tomcat 9 上進行的。
更新
也嘗試過這個配置。同樣的不期望的結果。
<VirtualHost *:80>
ServerAlias a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin webmaster@localhost
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
#Proxies
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
更新
好吧,我剛剛發現了一些非常煩人的事情。如果我用瀏覽器輸入a.domain.com
或b.domain.com
,它們都會解析為a.domain.com
。這就是我最初描述的問題。但如果嘗試https://a.domain.com
或https://b.domain.com
,兩者都會解析到正確的伺服器:a
to8444
和b
to 8445
。
由於這非常令人沮喪,我會先煞車並分析一下。
更新
經過長時間的煞車後,我嘗試了一些其他隨機調整,只是為了看看發生了什麼,但除了使用 HTTPS 時之外,一切都沒有按預期工作。我安裝了 Postman 來查看請求中發送的內容,發現在 Postman 中,HTTP 和 HTTPS 都正確使用主機。更好/更糟:實際回應顯示a.domain.com
和的不同歡迎頁面b.domain.com
,這意味著當我使用 Postman 時,我的配置工作正常。
我認為所有這些考驗可能只是快取問題,但我選擇的測試瀏覽器(Firefox dev ed)設定為不快取內容。我將使用curl 和其他瀏覽器檢查回應。
答案1
罪魁禍首:快取。
在某些時候,我的瀏覽器配置發生了變化(也許是更新?),我有超過 3GB 的緩存,包括我試圖設定為子網域的測試網站。哎呀。
清除快取後,如預期的那樣,在訪問我的 URL 時會提示有關我的自簽名憑證的警報。接受風險後,我被重定向到正確的網站。這是透過使用b.domain.com
而不添加協議。
為了確保它有效,我在所有其他 7 個瀏覽器中進行了測試(必須確保),並在使用和不使用協議的情況下進行了 curl 測試,結果也是預期的。
最後配置就ok了。如果您需要,我會將其發佈在這裡Apache 伺服器透過子網域代理到特定 Tomcat 實例,使用 proxy_mod 也立即從連接埠 80 重定向到連接埠 433。
<VirtualHost *:80>
ServerName a.domain.com
Redirect permanent / https://a.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName a.domain.com
ServerAdmin [email protected]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#SSL stuff
SSLEngine On
SSLCertificateFile /etc/ssl/certs/DONT_USE_SELF_SIGNED.pem
SSLCertificateKeyFile /etc/ssl/private/CERTS_IN_PRODUCTIve.key
SSLVerifyClient none
#Proxies
ProxyRequests Off
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
#Redirections
Redirect /b https://b.domain.com
<Location />
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
<Location /a>
ProxyPass https://localhost:8444/
ProxyPassReverse https://localhost:8444/
</Location>
</VirtualHost>
請注意 SSL 代理程式和 SSL 的設定適用於自簽章憑證。如果您在生產環境中實施此操作,請閱讀每個相關文件。另請注意,這是 的設定檔a.domain.com
。等效項b.domain.com
完全相同,具有適當的伺服器名稱、伺服器別名、重定向、本機的位置和連接埠。