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


11

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

絶対パスを持つリバースプロキシしているページがいくつかあります。これはサイトを破壊します。それらは置き換える必要があり、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="/server///uat.site.co.jp/css/css.css

<link href="/server///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>

よくわかりません。HTML aタグからのもののようです。このリンクをクリックすると、Webブラウザーがリンクをたどるのではなく、ファイルブラウザー(Windowsエクスプローラー)がUNCを開こうとします。HTMLテキスト内のその文字列を置き換えようとしていますか?
-GregL

それらのサイトは正常に機能します。ただし、ファイアウォールの内側に配置すると、当然ながら多くのcssおよびイメージで404が取得されます。通常、すべては200
ZZ9

それらは、IISサーバー上のリンクタグ<link href = "// fqdn / asset"からのものです
-ZZ9

linkタグでUNCパスを提供できるとは思わない。できれば、それは良いアイデアだとは言えません。いずれにしても、それはあなたの質問ではありません。Apacheのによるとドキュメントsubstitute指令は内部でのみ有効であるDirectoryブロックまたは.htaccessファイル。<location>(/の場合でも)ブロックを作成して、そこにディレクティブを配置してください。
GregL

2
@GregL、この形式のURLは「プロトコル相対」URLであり、ページにリンクするための完全に有効な方法ですが、一般的には知られていません。「//domain.com/path」は、ブラウザにリンクを含むページを要求するために使用されたのと同じプロトコルでドキュメントを要求させます。
テロキルカネン

回答:


11

これを行うことができる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ドキュメントに詳細情報があります。


こんにちは、提案に感謝します。残念ながら、私はこの道をあまり運がありませんでした。ただし、プロキシの外部で正常にテストしました。mod_proxyはそれを無視するようです。
ZZ9

参考になる情報を追加しました。
ジェニーD

1
おかげで、これは動作します。Apacheが/etc/httpd/conf.d/内の.conf(vhost.bak)で終わっていないファイルのバックアップを拾い上げている不具合であることが判明しました。
ZZ9

7

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

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


ページにHTML 200が表示されますが、ブラウザーに次の内容が表示されます。コンテンツエンコーディングエラー表示しようとしているページは、無効またはサポートされていない圧縮形式を使用しているため表示できません。
ZZ9

ああ、これらをVirtualHostに追加します。RequestHeaderは受け入れエンコードおよび設定解除もRequestHeaderセット受け入れエンコードアイデンティティ
g491

元の代替回線が機能​​するように、回答を更新しました。試してみるのが簡単で、何が起こっているかもしれないので、まず試してみることをお勧めします。
g491

偉大な答えの更新が、私は他の答えが最初に取り組んだ
ZZ9

1
私の場合、それは圧縮であり、釘付けでした。それは私を夢中にさせていました...ありがとうございました!
そのブラジル人

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