Ist es möglich, Inhalte auf jeder Seite zu ersetzen, die über einen Proxy geleitet wird, ähnlich wie mod_rewrite für URLs verwendet wird?

11

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

Ich habe einige Seiten, die ich als Reverse-Proxy verwende und die absolute Pfade haben. Dies bricht die Website. Sie müssen ersetzt werden und Tools wie mod_rewrite nehmen 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>

Keiner der oben genannten Punkte funktioniert beim Ersetzen der HTML-Zeichenfolge

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

mit

<link href="/server///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>
AirCombat
quelle
Ich bin verwirrt. Das sieht aus wie aus einem HTML- aTag. Wenn Sie auf diesen Link klicken, folgt wahrscheinlich nicht der Webbrowser dem Link, sondern ein Dateibrowser (Windows Explorer), der versucht, den UNC zu öffnen. Versuchen Sie, diese Zeichenfolge in HTML-Text zu ersetzen?
GregL
Die Seite funktioniert korrekt. Sobald wir es jedoch hinter eine Firewall stellen, erhalten wir natürlich 404s auf einer Reihe von CSS und Bildern. Normalerweise bekommt alles 200
AirCombat
Sie stammen von Link-Tags auf einem IIS-Server <link href = "// fqdn / asset"
AirCombat
Ich glaube nicht, dass Sie UNC-Pfade in linkTags bereitstellen können . Wenn Sie können, kann ich nicht sagen, dass es eine gute Idee wäre. Auf jeden Fall ist das nicht Ihre Frage. Gemäß den Apache- Dokumenten ist die substituteDirektive nur innerhalb von DirectoryBlöcken oder .htaccessDateien gültig . Versuchen Sie, einen <location>Block zu erstellen (auch wenn er für / ist), und fügen Sie die Direktive dort ein.
GregL
2
@ GregL, dieses URL-Format ist eine "protokollbezogene" URL. Es ist eine absolut gültige Methode, um auf Seiten zu verlinken, obwohl es nicht so allgemein bekannt ist. "//domain.com/path" veranlasst den Browser, das Dokument mit demselben Protokoll anzufordern, mit dem die Seite mit dem Link angefordert wurde.
Tero Kilkanen

Antworten:

10

Es gibt ein Apache-Modul namens mod_substitute, das dies kann. Hier ist 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 .

Jenny D.
quelle
Hallo, danke für den Vorschlag, leider hatte ich auf diesem Weg nicht viel Glück. Ich habe es jedoch außerhalb des Proxys erfolgreich getestet. Es scheint, dass mod_proxy es ignoriert.
AirCombat
Ich habe einige weitere Informationen hinzugefügt, die hilfreich sein können.
Jenny D
1
Vielen Dank, das funktioniert. Es stellte sich heraus, dass Apache Backups meiner Dateien in /etc/httpd/conf.d/ abholte, die nicht mit .conf (vhost.bak) endeten.
AirCombat
6

Wenn Sie Apache noch nicht neu gestartet haben, stellen Sie sicher, dass Sie dies tun. Wenn Sie dies jedoch bereits getan haben, können Sie einen globalen Ausgabefilter verwenden, der ein benutzerdefiniertes PHP-Skript ausführt, um das Ersetzen durchzuführen, um festzustellen, ob dies aus irgendeinem Grund behoben ist .

BEARBEITEN: Basierend auf Ihrem Kommentar kann es sein, dass der Ersatz nicht funktioniert, weil der Inhalt komprimiert ist. Fügen Sie Ihrem VirtualHost die folgenden Zeilen hinzu, um die Komprimierung zu deaktivieren:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Wenn dies nicht funktioniert, versuchen Sie Folgendes:

Fügen Sie diese zu Ihrer Conf hinzu und aktualisieren Sie natürlich die Pfade:

#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 einen Code wie den folgenden:

#!/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 sie in Ihrem Beispiel haben.

g491
quelle
Ich erhalte einen HTML 200-Wert auf der Seite, aber der Browser zeigt Folgendes an: Fehler beim Codieren von Inhalten Die Seite, die Sie anzeigen möchten, kann nicht angezeigt werden, da eine ungültige oder nicht unterstützte Form der Komprimierung verwendet wird.
AirCombat
Ah, fügen Sie diese Ihrem VirtualHost hinzu. RequestHeader deaktiviert Accept-Encoding und auch RequestHeader setzen Accept-Encoding Identität
g491
Ich habe meine Antwort mit etwas aktualisiert, um zu versuchen, Ihre ursprüngliche Ersatzleitung zum Laufen zu bringen. Ich würde empfehlen, dies zuerst zu versuchen, da es einfacher zu versuchen ist und möglicherweise das ist, was gerade passiert.
G491
Update für eine gute Antwort, aber ich habe die andere Antwort zuerst funktioniert
AirCombat
1
In meinem Fall war es die Kompression, genagelt. Es hat mich verrückt gemacht ... vielen Dank!
Dieser Brasilianer