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

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

Apache でリバース プロキシを次のように設定しています。

アドレスが www.example.com/folder のサーバー A はリバース プロキシ サーバーです。

これは、アドレスが test.madeupurl.com であるサーバー B にマップされます。

これはある程度機能します。しかし、私が抱えている問題は、www.example.com/folder 上のすべての相対リンクが www.example.com/folder/css/examplefilename.css ではなく www.example.com/css/examplefilename.css の形式になっていることです。

これを修正するにはどうすればいいでしょうか?

これまでのところ、リバース プロキシはサーバー A (www.example.com) 上で次のようになっています。

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

答え1

Apache ProxyPassRewriteは、受信したレスポンス本文を書き換えません。http://test.example.com、ヘッダーのみ(404 ページへのリダイレクトなど)。

いくつかの選択肢:

1つ) 内部アプリを書き換えて、絶対パスではなく相対パスを使用するようにします。つまり../css/style.css/css/style.css

/folder) 内部アプリをtest.example.com のルートではなく、同じサブディレクトリに再デプロイします。

三つ) 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/

) 内部アプリ用に別のサブドメインを作成し、すべてをリバース プロキシするだけです。

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

) スプリット ホライズン DNS とシナリオ 4 の組み合わせソリューションを使用できます。内部ユーザーと外部ユーザーの両方が test.example.com を使用しますが、内部 DNS は test.example.com のサーバーの IP アドレスを直接ポイントします。外部ユーザーの場合、test.example.com のパブリック レコードはパブリック Web サーバーの 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>

後期編集

) 開発者は、アプリケーションがリバース プロキシの背後にあるデプロイメント専用の特別なアプリケーション設定を提供する場合があります。アプリケーションは、ユーザーが使用している/使用すべきプロトコル、サイト名、URIパスを使用して、自己参照URLを生成するように構成できます。次にホスト名、プロトコル、および/またはアプリケーションが検出したURI、 のような用語が想定されますexternal URLsite URLその場合、Apache で何も解決する必要はありません。

答え2

補足としてHBruijn さんの答え、解決策を選択した場合(3)「ProxyPass」も使用する必要があるかもしれませんmod_proxy_htmlHTML ページ内の一部の URL を書き換えます。

参照。リバースプロキシで相対URLを正しく処理する方法いくつかの例を示します。

応用例として、Apacheをルールを使っProxyHTMLURLMapてすべて転送するように設定する方法を次に示します。your-domain-name.com/padあなたのイーサパッドポート 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]

答え3

リバースプロキシを作成するには、次の方法を使用できます。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>  
    

これが役に立つことを願っています。

関連情報