Apache-2.2

使用反向代理更改源中的 URL?

  • March 3, 2014

有時我們會在另一台伺服器上複製實時站點以測試新功能。許多 CMS 系統對數據庫中的 URL 進行硬編碼,因此不可能只使用另一個 URL。在我們的本地系統上,我們只是使用 hosts 文件將請求重定向到另一個 IP。這對我們的客戶來說太複雜了,所以我們需要一種更簡單的方法。可以使用 apache(我們使用 apache 作為網路伺服器)作為反向代理,因此它將 dev.somedomain.com 重定向到 anotherdomain.com。剩下的唯一問題是,HTML 原始碼中有指向 anotherdomain.com 的絕對連結。有沒有辦法讓 apache(或其他軟體)在所有頁面(+js +css)中將所有指向 http(s)://anotherdomain.com 的連結替換為 http(s)://dev.somedomain.com?

性能不是問題,因為這顯然永遠不會在多人使用的系統上執行。

感謝您對 mod_filter 的提示。它現在似乎工作了!我對這個事實有疑問,該網站同時使用了帶有 www 的 url。和一個沒有。我的配置是:

   <VirtualHost *:801>
     ServerName www.dev.domain1.com

     ServerAdmin office@domain2.com

    SetEnvIf X-Forwarded-Proto https HTTPS=on

     FilterProvider gzinflate INFLATE resp=Content-Encoding $gzip
     FilterProvider replace SUBSTITUTE Content-Type $text/
     FilterProvider gzdeflate DEFLATE Content-Type $text/
     FilterChain +gzinflate +replace +gzdeflate
     Substitute "s|domain2.com|dev.domain1.com|n"


    ProxyPass / http://www.domain2.com/
    ProxyPassReverse / http://www.domain2.com/
   # ProxyHTMLEnable On
    ProxyHTMLURLMap http://www.domain2.com/ /



     ErrorLog /var/log/apache2/dev-proxy-error.log

     LogLevel warn

     CustomLog /var/log/apache2/dev-proxy-access.log combined

   </VirtualHost>

對於沒有 www 的域

   <VirtualHost *:801>
     ServerName dev.domain1.com

     ServerAdmin office@domain2.com

    SetEnvIf X-Forwarded-Proto https HTTPS=on

     FilterProvider gzinflate INFLATE resp=Content-Encoding $gzip
     FilterProvider replace SUBSTITUTE Content-Type $text/
     FilterProvider gzdeflate DEFLATE Content-Type $text/
     FilterChain +gzinflate +replace +gzdeflate
     Substitute "s|domain2.com|dev.domain1.com|n"


    ProxyPass / http://domain2.com/
    ProxyPassReverse / http://domain2.com/
   # ProxyHTMLEnable On
    ProxyHTMLURLMap http://domain2.com/ /



     ErrorLog /var/log/apache2/dev-proxy-error.log

     LogLevel warn

     CustomLog /var/log/apache2/def-proxy-access.log combined

   </VirtualHost>

僅 ProxyHTMLURLMap 是不夠的,因為它只替換完全相同的域。在帶有 www 的域上,沒有的域不會被替換,反之亦然。

我希望這可以幫助別人。不過,使用這個廣泛的過濾器,我強烈建議不要在生產站點上使用它!

Apache 確實為此提供了一個模組 - 它稱為mod_filter

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