
問題:
クエリ文字列パラメータで削除サーバーが指定されているリバース プロキシとして Apache を設定しようとしています。
mywebapp.comでサイトを提供しているとします。http://mywebapp.com/proxy?url=http://www.someothersite.comApacheはリバースプロキシとして動作し、http://www.someothersite.com同様に、http://mywebapp.com/proxy?url=https://login.notmysite.comApacheはリバースプロキシとして動作し、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. クッキーをサポート
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 つでも満たすのに役立つ回答を提供していただければ、上記の構成を更新してコミュニティに公開します。
答え1
mod_headers はこれを処理できる可能性があります。
Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"
このexpr
部分には Apache 2.4 が必要です。
注: これはテストしていません。
参考文献:
Apache 2.4 の .mod は、以下の URL からダウンロードできます。 詳しくは http://httpd.apache.org/docs/2.4/expr.html をご覧ください。
答え2
おそらくそれを解決するにはポンドより簡単かつ安全になります。ただし、リダイレクトではなくリバース プロキシになります。
また、小さな PHP スクリプトでも同じことができます...
答え3
あなたのアイデアの最大の問題は、リバース プロキシがバックエンドに Cookie を送信することを期待しているが、クライアントがフロントエンドに Cookie を送信しないことです (バックエンドの Cookie ドメインがフロントエンドより劣っている場合を除く)。
mod_proxy はおそらく使いにくいので、この場合は mod_rewrite を使用すると目的に早く到達できると思います。
... しかし、おそらく設計に欠陥がある可能性のある問題を解決しようとしているのだと思います。このソリューションで解決しようとしている問題についてさらに詳しく説明していただければ、もう少しわかりやすい提案ができるかもしれません。