web-dev-qa-db-ja.com

リバースプロキシで相対URLを正しく処理する方法

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>
56
Hard worker

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>
86
HBruijn

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]

9
Lucas Cimon

次の方法でリバースプロキシを作成できます。
1。 mod_proxy_htmlをインストールする

    yum install mod_proxy_html
  1. Mod_proxy_htmlモジュールをロードする

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. そして、次の設定を使用します

    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>  
    

この助けを願っています。

5
ThanhHH