Linux

如何使用反向代理正確處理相對 url

  • November 26, 2020

我在 Apache 中有如下反向代理設置:

地址為 www.example.com/folder 的伺服器 A 是反向代理伺服器。

它映射到:地址為 test.madeupurl.com 的伺服器 B

這種作品。但我遇到的問題是,在 www.example.com/folder 上,所有相關連結的形式都是 www.example.com/css/examplefilename.css 而不是 www.example.com/folder/css/examplefilename。 css

我該如何解決?

到目前為止,我的反向代理在伺服器 A (www.example.com) 上有這個:

<Location /folder>
   ProxyPass  http://test.madeupurl.com
   ProxyPassReverse http://test.madeupurl.com
</Location>

Apache ProxyPassRewrite 不會重寫從http://test.example.com收到的響應正文,僅重寫標題(如重定向到 404 頁面等)。

多種選擇:

)重寫內部應用程序以使用相對路徑而不是絕對路徑。即../css/style.css代替/css/style.css

)將內部應用程序重新部署在同一子目錄/folder中,而不是在 test.example.com 的根目錄中。

)一個和兩個通常不太可能發生……如果你很幸運,內部應用程序只使用兩個或三個子目錄***,而這些子目錄在你的主站點上沒有使用***,只需編寫一堆 ProxyPass 行:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

)為內部應用程序創建一個單獨的子域並簡單地反向代理所有內容:

<VirtualHost *:80>
  ServerName app.example.com/
  # Expose Internal App to the internet.
  ProxyPass /  http://test.internal.example.com/
  ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

)有時開發人員完全一無所知,他們的應用程序不僅生成絕對 URL,甚至在其 URL 中包含主機名部分,生成的 HTML 程式碼如下所示<img src=http://test.example.com/icons/logo.png>

A ) 您可以使用水平分割 DNS 和方案 4 的組合解決方案。內部和外部使用者都使用 test.example.com,但您的內部 DNS 直接指向 test.example.com 的伺服器的 IP 地址。對於外部使用者,test.example.com 的公共記錄指向您的公共網路伺服器 www.example.com 的 IP 地址,然後您可以使用解決方案 4。

B ) 實際上,您不僅可以讓 apache 代理對 test.example.com 的請求,還可以在將響應正文傳輸給您的使用者之前重寫響應正文。(通常代理只重寫 HTTP 標頭/響應)。apache 2.2 中的 mod_substitute。我還沒有測試它是否與 mod_proxy 很好地堆疊,但也許以下工作:

<Location /folder/>
 ProxyPass http://test.example.com/
 ProxyPassReverse http://test.example.com/ 
 AddOutputFilterByType SUBSTITUTE text/html
 Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>

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