fragen stichworte

Ist es möglich, den Inhalt jeder Seite zu ersetzen, die durch einen Proxy geleitet wird, ähnlich wie bei der Verwendung von mod_rewrite für URLs?

Ist es möglich, den Inhalt jeder Seite, die durch einen Proxy geleitet wird, zu ersetzen, ähnlich wie bei mod_rewrite für URLs? Die Dokumentation zum Ersatz ist nicht klar.

Ich habe einige Seiten, in denen ich umgekehrte Proxys verwenden kann, die absolute Pfade haben. Dies bricht die Site. Sie müssen ersetzt werden, und Tools wie mod_rewrite greifen sie nicht auf, da es sich nicht um URL-Anforderungen handelt.

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

Keines der obigen Punkte ersetzt den HTML-String

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

mit

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

Conf nach Änderungen:

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

antworten

Es gibt ein Apache-Modul namens mod_substitute, das dies tun kann. Hier ein kurzes Beispiel:

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

Oder in Kombination mit 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"

Weitere Informationen finden Sie in der Apache-Dokumentation für mod_substitute.

Wenn Sie Apache nicht neu gestartet haben, stellen Sie sicher, dass Sie dies tun. Wenn Sie dies bereits getan haben, können Sie einen globalen Ausgabefilter verwenden, der ein benutzerdefiniertes PHP-Skript ausführt, um zu ersetzen, ob das Problem dadurch gelöst wird aus irgendeinem Grund.

BEARBEITEN: Aufgrund Ihres Kommentars funktioniert der Ersatz möglicherweise nicht, da der Inhalt komprimiert ist. Um die Komprimierung zu deaktivieren, fügen Sie Ihrem VirtualHost diese Zeilen hinzu:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Wenn dies nicht funktioniert, versuchen Sie Folgendes:

Fügen Sie diese zu Ihrer Konfiguration hinzu und aktualisieren Sie die Pfade des Kurses:

#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

In proxyfilter.php haben Sie folgenden Code wie folgt:

#!/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);

Wenn dies funktioniert, beschränken Sie den Fokus auf Text/HTML-Inhalte, wie Sie es in Ihrem Beispiel getan haben.

Nach https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse, das die Header neu schreibt, verwenden Sie "

To rewrite HTML content to match the proxy, you must load and enable mod_proxy_html.