設置 Apache 子域重定向到另一個子域
我正在嘗試設置兩個子域,for
a
和b
indomain.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 記錄了 whata.domain.com
和b.domain.com
are,這是相同的 IP(我也在我正在測試它的機器上做了這個)。另請注意,我沒有從他們的根目錄中提供任何內容。我補充說,試圖解決標題中所述的問題。不過,兩個目錄中都有一個簡單的 html。
實際問題是什麼?
簡單地說,在嘗試時
a.domain.com
,結果是來自 的 webapplocalhost: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 嗎?如果可能的話,我想為每個 webapp 保留一個文件。謝謝!
這是在 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
to8445
。因為這非常令人沮喪,所以我會在一段時間內停下來分析一下。
更新
經過長時間的剎車後,我嘗試了一些其他的隨機調整,只是為了看看發生了什麼,但除了使用 HTTPS 時,再次沒有按預期工作。我安裝了 Postman 以查看請求中發送的內容,並發現在 Postman 中,HTTP 和 HTTPS 都正確使用了主機。更好/更糟:實際響應顯示 和 的不同歡迎頁面
a.domain.com
,b.domain.com
這意味著當我使用 Postman 時,我的配置工作正常。我認為所有這些考驗可能只是記憶體問題,但我選擇的測試瀏覽器(Firefox 開發版)設置為不記憶體內容。我將使用 curl 和其他瀏覽器檢查響應。
罪魁禍首:記憶體。
在某些時候,我的瀏覽器的配置發生了變化(也許是更新?)並且我擁有超過 3GB 的記憶體,包括我試圖設置為子域的測試站點。哎呀。
清除記憶體後,在訪問我的 URL 時提示有關我的自簽名證書的警報,正如預期的那樣。接受風險後,我被重定向到正確的站點。這是通過使用
b.domain.com
而不添加協議。為了確保這能正常工作,我在所有其他 7 個瀏覽器中進行了測試(一定要確保),並在使用和不使用協議的情況下進行 curl,結果也是預期的。
最後配置沒問題。*如果您需要通過子域代理到特定 Tomcat 實例的 Apache 伺服器,*我將在此處發布它,使用 proxy_mod 也會立即從埠 80 重定向到埠 433 。
<VirtualHost *:80> ServerName a.domain.com Redirect permanent / https://a.domain.com/ </VirtualHost> <VirtualHost *:443> ServerName a.domain.com ServerAdmin sad-admin@domain.com 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
. for 的等價物b.domain.com
完全相同,具有適當的 ServerName、ServerAlias、redirects、Location 和 localhost 埠。