Czy możliwe jest zastąpienie treści na każdej stronie przechodzącej przez serwer proxy podobnie jak w przypadku mod_rewrite dla adresów URL?

11

Czy możliwe jest zastąpienie treści na każdej stronie przechodzącej przez serwer proxy podobnie jak w przypadku mod_rewrite dla adresów URL? Dokumentacja zastępcza nie jest jasna.

Mam kilka stron, które odwracam, które mają ścieżki bezwzględne. To psuje witrynę. Potrzebują wymiany, a narzędzia takie jak mod_rewrite nie wychwytują ich, ponieważ nie są żądaniami adresów 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>

Żadne z powyższych nie zastępuje ciągu HTML

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

z

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

Konf. Po zmianach:

<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>
ZZ9
źródło
Jestem zmieszany. Wygląda na to, że pochodzi z atagu HTML . Kliknięcie tego łącza prawdopodobnie nie spowoduje, że przeglądarka internetowa podąży za nim, a raczej przeglądarka plików (Eksplorator Windows), która spróbuje otworzyć UNC. Czy próbujesz zastąpić ten ciąg w tekście HTML?
GregL,
Działają one poprawnie. Jednak po umieszczeniu go za zaporą ogniową często dostajemy 404s na kilka plików css i obrazów. Normalnie wszystko dostaje 200
ZZ9
Pochodzą z tagów linków na serwerze IIS <link href = "// fqdn / asset"
ZZ9
Nie sądzę, że możesz podać ścieżki UNC w linktagach. Jeśli możesz, nie mogę powiedzieć, że byłby to dobry pomysł. W każdym razie to nie twoje pytanie. Według dokumentów Apache , substitutedyrektywa obowiązuje tylko w Directoryblokach lub .htaccessplikach. Spróbuj utworzyć <location>blok (nawet jeśli jest dla /) i umieść tam dyrektywę.
GregL,
2
@GregL, ten format adresu URL jest adresem „zależnym od protokołu”, jest to całkowicie poprawny sposób na linkowanie do stron, chociaż nie jest tak powszechnie znany. „//domain.com/path” powoduje, że przeglądarka żąda dokumentu za pomocą tego samego protokołu, którego użyto do żądania strony zawierającej link.
Tero Kilkanen

Odpowiedzi:

11

Istnieje moduł apache o nazwie mod_substitute, który może to zrobić. Oto krótki przykład:

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

Lub w połączeniu z 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"

Więcej informacji znajduje się w dokumentacji Apache dla mod_substitute .

Jenny D.
źródło
Cześć, dzięki za sugestię, niestety nie miałem dużo szczęścia na tej ścieżce. Jednak pomyślnie przetestowałem go poza serwerem proxy. Wygląda na to, że mod_proxy ignoruje to.
ZZ9
Dodałem więcej informacji, które mogą być pomocne.
Jenny D
1
Wielkie dzięki, to działa. Okazało się, że to usterka, ponieważ Apache pobiera kopie zapasowe moich plików w /etc/httpd/conf.d/, które nie kończą się na .conf (vhost.bak).
ZZ9
7

Jeśli nie zrestartowałeś Apache, pamiętaj, aby to zrobić, ale jeśli już to zrobiłeś, możesz wypróbować globalny filtr wyjściowy, który uruchamia niestandardowy skrypt PHP w celu zastąpienia, aby sprawdzić, czy to z jakiegoś powodu go rozwiązuje. .

EDYCJA: na podstawie twojego komentarza może się zdarzyć, że substytut nie działa, ponieważ zawartość jest skompresowana. Aby wyłączyć kompresję, dodaj te linie do VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Jeśli to nie zadziała, spróbuj wykonać następujące czynności:

Dodaj je do swojego conf, aktualizując oczywiście ścieżki:

#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

W proxyfilter.php mają kod taki jak poniżej:

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

Jeśli to działa, zawęź to pole do treści tekstowej / HTML tak jak w przykładzie.

g491
źródło
Na stronie pojawia się HTML 200, ale przeglądarka pokazuje: Błąd kodowania treści Strony, którą próbujesz wyświetlić, nie można wyświetlić, ponieważ używa ona nieprawidłowej lub nieobsługiwanej formy kompresji.
ZZ9
Ach, dodaj je do VirtualHost. RequestHeader nie ustawił Accept-Encoding, a także RequestHeader ustawił Accept-Encoding tożsamości
g491 22.04.15
Zaktualizowałem swoją odpowiedź, próbując uruchomić oryginalną linię zastępczą. Polecam spróbować najpierw, ponieważ łatwiej jest spróbować i może być tym, co się dzieje.
g491
Aktualizacja dla wielkiego odpowiedź, ale mam drugą odpowiedź działa pierwszy
ZZ9
1
W moim przypadku była to kompresja, przybita. Doprowadzało mnie to do szału ... dziękuję bardzo!
Ten Brazylijczyk