Apacheで次のようにリバースプロキシを設定しています。
アドレスがwww.example.com/folderのサーバーAは、リバースプロキシサーバーです。
マップ先:アドレスtest.madeupurl.comのサーバーB
この種の作品。しかし、私が抱えている問題は、www.example.com/folderでは、すべての相対リンクがwww.example.com/folder/css/examplefilenameではなく、www.example.com/css/examplefilename.cssの形式になっていることです。 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ページへのリダイレクトなど)を書き換えます。
いくつかの選択肢:
One)内部アプリを書き換えて、絶対パスではなく相対パスを使用します。つまり、../css/style.css
の代わりに/css/style.css
Two)内部アプリをtest.example.comのルートではなく、同じサブディレクトリ/folder
に再デプロイします。
Three)1つと2つが発生することはほとんどありません...運が良ければ、内部アプリは2つまたは3つのサブディレクトリそしてそれらはあなたのメインサイトでは使用されていません、単に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/
Four)内部アプリ用に別のサブドメインを作成し、すべてをリバースプロキシします。
<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>
5)時々開発者 完全に無知であり、 アプリケーションに絶対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>
HBruijn の回答の補足として、ソリューション(3) "ProxyPass"を選択した場合、 mod_proxy_html を使用して、HTMLページの一部のURLを書き換えます。
cf. リバースプロキシで相対URLを正しく処理する方法 いくつかの例。
適用例として、ProxyHTMLURLMap
ルールを使用してApacheを構成し、your-domain-name.com/padにあるすべてのものを-に転送する方法を次に示します。 Etherpad ポート9001でローカルに実行されているインスタンス:
<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]
次の方法でリバースプロキシを作成できます。
1。 mod_proxy_htmlをインストールする
yum install mod_proxy_html
Mod_proxy_htmlモジュールをロードする
LoadModule proxy_html_module modules/mod_proxy_html.so
そして、次の設定を使用します
ProxyRequests off
ProxyPass /folder/ http://test.madeupurl.com
ProxyHTMLURLMap http://test.madeupurl.com /folder
<Location /folder/>
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap / /folder/
RequestHeader unset Accept-Encoding
</Location>
この助けを願っています。