web-dev-qa-db-ja.com

URLにmod_rewriteを使用する方法と同様に、プロキシを介して渡されるすべてのページのコンテンツを置き換えることはできますか?

URLにmod_rewriteを使用する方法と同様に、プロキシを介して渡されるすべてのページのコンテンツを置き換えることはできますか?代替に関する文書は明確ではありません。

絶対パスを持つリバースプロキシのページがあります。これはサイトを壊します。それらは置換が必要で、mod_rewriteのようなツールはURLリクエストではないため、それらを取得しません。

<VirtualHost *:80>
    ServerName  servername1
    ServerAlias servername2

    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common

    RewriteEngine on
    LogLevel alert rewrite:trace2
    RewriteCond %{HTTP_Host} /uat.site.co.jp$ [NC]
    RewriteRule ^(.*)$ http://jp.uat.site2uk.co.uk/$1 [P]

    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|i"


    ProxyRequests Off

    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
</VirtualHost>

上記のどちらも、HTML文字列の置き換えでは機能しません。

<link href="//uat.site.co.jp/css/css.css

<link href="//uat.site2uk.co.uk/css/css.css

変更後の会議:

<VirtualHost *:80>
    ServerName  jp.uat.site2uk.co.uk
    ServerAlias uat.site.co.jp
    ErrorLog "/var/log/proxy/jpuat_prox_error_log"
    CustomLog "/var/log/proxy/jpuat_prox_access_log" common
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass / http://uat.site.co.jp/
    ProxyPassReverse / http://uat.site.co.jp/
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s|uat.site.co.jp|jp.uat.site2uk.co.uk|ni"
</VirtualHost>
11
ZZ9

これを行うことができるmod_substituteと呼ばれるApacheモジュールがあります。以下に短い例を示します。

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s/uat.site.co.jp/jp.uat.site2uk.co.uk/ni"
</Location>

または、mod_proxyと組み合わせると:

ProxyPass / http://uat.site.co.jp/
ProxyPassReverse / http://uat.site.co.jp/

Substitute "s|http://uat.site.co.jp/|http://jp.uat.site2uk.co.uk/|i"

詳細は mod_substituteのApacheドキュメント にあります。

11
Jenny D

Apacheを再起動していない場合は、必ず再起動してください。ただし、すでに再起動している場合は、カスタムのPHPスクリプトを実行するグ​​ローバル出力フィルターを試してみてください。それが何らかの理由でそれを解決するかどうかを確認します。

編集:あなたのコメントに基づいて、コンテンツが圧縮されているため、代替が機能していない可能性があります。圧縮をオフにするには、VirtualHostに次の行を追加します。

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

それがうまくいかない場合は、以下を試してください:

これらをconfに追加して、もちろんパスを更新します。

#add this outside of any VirtualHost tags
ExtFilterDefine proxiedcontentfilter mode=output cmd="/usr/bin/php /var/www/proxyfilter.php"

#add these in your VirtualHost tag
RequestHeader unset Accept-Encoding 
RequestHeader set Accept-Encoding identity
SetOutputFilter proxiedcontentfilter

Proxyfilter.phpには、次のようなコードがあります。

#!/usr/bin/php
<?php
$html = file_get_contents('php://stdin');
$html = str_ireplace('uat.site.co.jp', 'jp.uat.site2uk.co.uk', $html);
file_put_contents('php://stdout', $html);

これが機能する場合は、例のように、焦点をtext/htmlコンテンツのみに絞り込みます。

7
g491

ヘッダーを書き換える https://httpd.Apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse によると、「

プロキシと一致するようにHTMLコンテンツを書き換えるには、mod_proxy_htmlをロードして有効にする必要があります。

0
eckes