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


51

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>

覚えている場合、HBruijnの答えで、以下の解決策のどれがあなたのために働いたのですか?
キンバリーW

回答:


81

Apache ProxyPassRewriteは、http://test.example.comから受信した応答本文を書き換えず、ヘッダー(404ページへのリダイレクトなど)のみを書き換えます。

多数の選択肢:

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

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

3)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/

4)内部アプリ用に個別のサブドメインを作成し、すべてを単純にリバースプロキシします。

<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のパブリックレコードはパブリックWebサーバーwww.example.comのIPアドレスを指しているため、ソリューション4を使用できます。

B)実際には、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>

4
神聖な牛の良い答え。これらのどれも試したことはありませんが、記事を書いてくれてありがとうと言いたいだけです!万人を助けます。これらのアイデアのいくつかを今すぐテスト
勤勉な人

ポイント2について、簡単な質問をお願いします。正しく理解できた場合、adppをtest.madeupurl.com/folderに再デプロイすることを提案していますか?これには私のApache設定ファイルへの変更が必要ですか?これは最も速い解決策のように見えます
ハードワーカー

さらに、お手数ですが、質問1で説明した問題を解決しようとすると、ポイント1が引き続き発生します。たとえば、ここで私は使用しました:<link rel = "stylesheet" type = "text / css" href = "../ css / custom.css" />そしてブラウザーのリンクアドレスに対してtest.madeupurl.comを出力しています/css/bootstrap.cssではなくtest.madeupurl.com/folder/css/bootstrap.css。これについて何か提案はありますか?最も役立つと思います
ハードワーカー

多くの場合、DocumentRootにインストールされているアプリケーションを/ folderなどのサブディレクトリに再デプロイすると、スタイルシート、アイコンなどが/ folder / cssおよび/ folder / iconsなどにデプロイされます。その後、HTML出力のリンク<img src=/folder/icons/button.png>はターンはProxyPass /folder/ http://test.madeupurl.com/folder/ディレクティブによってキャッチされます。
HBruijn

test.madeupurl.com/content/index.htmlページには、test.madeupurl.com / css / custom.cssを含める必要があります。その場所ではhref="../css/custom.css"、ではなく相対URL を使用する必要がありますhref="/css/custom.css"。インターネットユーザーがページを取得すると、URLはwww.example.com/folder/content/index.htmlになります。cssのURLは次のようになります: www.example.com/folder/content/../css/custom.cssこれは実際 www.example.com/folder/css/custom.cssにはに転送されtest.madeupurl.com/css/custom.cssます。
HBruijn

8

HBruijnの答えを補完するものとして、ソリューション(3) " ProxyPass "を選択した場合、mod_proxy_htmlを使用してHTMLページのURLを書き換える必要がある場合があります。

cf. いくつかの例では、リバースプロキシを使用して相対URLを正しく処理する方法

適用例として、your-domain-name.com / padのProxyHTMLURLMapすべてをポート9001でローカルに実行されているEtherpadインスタンスに転送するルールを使用してApacheを構成する方法を次に示します。

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


2
ただし、mod_proxy_htmlはApache 2.4以降からのみ含まれていることに注意してください。上記の元の質問はApache 2.2
HBruijn 14年

あなたの答えは完璧です。しかし、コンテンツがhtmlではなく、むしろpdfであるケースに出会いました。ProxyHTMLURLMapを使用しても機能しませんでした。他の提案はありますか?
モハメドエンナディエルイドリッシ

2
コンテンツがPDFの場合、URLを書き換える必要はありません!ユーザーがWebサイトの他のページにアクセスするためにPDF内のリンクをクリックすることを望まない限り、これには注意が必要です。URLの書き換えを無効にするには、最後の2つのディレクティブSetOutputFilter&を省略しProxyHTMLURLMapます。
ルーカスシモン

エンコードエラーを回避するために、RequestHeader unset Accept-Encodingを追加する必要がある場合があります
zar3bski

5

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.