Apache-2.4

設置 Apache 子域重定向到另一個子域

  • August 12, 2021

我正在嘗試設置兩個子域,forabin 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 記錄了 whata.domain.comb.domain.comare,這是相同的 IP(我也在我正在測試它的機器上做了這個)。

另請注意,我沒有從他們的根目錄中提供任何內容。我補充說,試圖解決標題中所述的問題。不過,兩個目錄中都有一個簡單的 html。

實際問題是什麼?

簡單地說,在嘗試時a.domain.com,結果是來自 的 webapp localhost:8444,正如預期的那樣。嘗試b.domain.com的時候,結果也是localhost:8444,而不是localhost:8445a.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.comb.domain.com,它們都解析為a.domain.com。這就是我最初描述的問題。但如果嘗試https://a.domain.comhttps://b.domain.com,都解析到正確的伺服器:ato8444bto 8445

因為這非常令人沮喪,所以我會在一段時間內停下來分析一下。

更新

經過長時間的剎車後,我嘗試了一些其他的隨機調整,只是為了看看發生了什麼,但除了使用 HTTPS 時,再次沒有按預期工作。我安裝了 Postman 以查看請求中發送的內容,並發現在 Postman 中,HTTP 和 HTTPS 都正確使用了主機。更好/更糟:實際響應顯示 和 的不同歡迎頁面a.domain.comb.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 埠。

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