
問題:
我正在嘗試將 apache 配置為反向代理,其中在查詢字串參數中指定刪除伺服器。
假設我正在為 mywebapp.com 上的網站提供服務。如果您導航至http://mywebapp.com/proxy?url=http://www.someothersite.com,那麼 apache 應該充當反向代理http://www.someothersite.com。同樣,如果您導航到http://mywebapp.com/proxy?url=https://login.notmysite.com,那麼 apache 應該充當反向代理https://login.notmysite.com。
注意事項:
1. 重寫回應 html 中的相對 url 以透過代理程式
2. 重寫來自遠端伺服器的重定向回應。例如,如果使用者請求 mywebapp.com/proxy?url=https://login.notmysite.com遠端伺服器響應重定向到https://login.notmysite.com/,那麼使用者的瀏覽器應該會看到重定向到 mywebapp.com/proxy?url=https://login.notmysite.com/。
3.支持http和https
4.支持cookies
5.合理的安全性。我不想打開代理供世界上的任何人使用 - 它只能在 mywebapp.com 託管的網站上的 iframe 中使用。
環境:
我正在使用 apache 2.2.24,但如果這會使問題更容易解決,我可以升級。
目前配置:
<VirtualHost 127.0.0.1:8081>
ServerName www.mywebapp.com
SSLProxyEngine On
RewriteEngine on
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy - [E=url:%1]
RewriteCond %{QUERY_STRING} ^url=(https?://[^:/]+)/?
RewriteRule ^/proxy - [E=url_host:%1]
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy %1 [P]
ProxyPassInterpolateEnv On
ProxyPassReverse /proxy/ ${url_host} interpolate
<Location /proxy>
ProxyHTMLEnable On
ProxyHTMLInterp On
ProxyHTMLURLMap / ${url_host}/ V
RequestHeader unset Accept-Encoding
</Location>
</VirtualHost>
對於考慮事項 #1,此配置似乎可以正常工作,但是對於考慮事項 #2,我遇到了障礙。我知道您通常使用 ProxyPassReverse 命令處理重定向,但我不確定如何讓它重寫查詢字串參數。
問題:
考慮到這些因素,Apache 是解決這個問題的合適工具嗎?
如果是這樣,我該如何設定 apache 的配置來滿足上述所有考慮因素?
我知道這是一個大問題 - 如果您可以貢獻一個答案來幫助我滿足其中一個考慮因素,那麼我將更新上述配置以供社區查看。
答案1
mod_headers 也許能夠處理這個問題。
Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"
該expr
部分需要 apache 2.4。
注意:我沒有測試過這個。
參考:
http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html
答案2
也許用以下方法解決它磅會更容易、更安全。但它不是重定向,而是反向代理。
一個小的 php 腳本也可以完成這項工作...
答案3
你的想法最大的問題是,如果你期望反向代理將cookie發送到後端,但客戶端不會將cookie發送到前端(除非後端cookie域不如前端)。
我建議 mod_proxy 可能太難使用,在這種情況下,使用 mod_rewrite 可以更快達到目標。
……但我認為您可能正在嘗試透過可能有缺陷的設計來解決問題。也許如果您可以進一步闡明您試圖用此解決方案解決的問題,我們也許可以提出一些更清晰的建議。