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

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

我正在嘗試設定兩個子網域, 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 記錄了“what”a.domain.comb.domain.com“are”,它們是相同的 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 的問題嗎?如果可能的話,我想為每個網路應用程式保留一個檔案。謝謝!

這是在 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.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完全相同,具有適當的伺服器名稱、伺服器別名、重定向、本機的位置和連接埠。

相關內容