Можно ли заменить содержимое на каждой странице, передаваемой через прокси, подобно тому, как 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>
ZZ9
источник
Я не совсем понимаю. Похоже, это из aтега HTML . Нажатие на эту ссылку скорее всего не приведет к тому, что веб-браузер перейдет по ссылке, а скорее к файловому браузеру (Windows Explorer), пытающемуся открыть UNC. Вы пытаетесь заменить эту строку в тексте HTML?
Грегл
У них сайт работает правильно. Однако, как только мы разместим его за брандмауэром, мы, конечно, получим 404 с кучей CSS и изображений. Обычно все получает 200
ZZ9
Они взяты из тегов ссылок на сервере IIS <link href = "// fqdn / asset"
ZZ9
Я не думаю, что вы можете предоставить пути UNC в linkтегах. Если вы можете, я не могу сказать, что это была бы хорошая идея .. В любом случае, это не ваш вопрос. Согласно документации Apache , substituteдиректива действует только внутри Directoryблоков или .htaccessфайлов. Попробуйте создать <location>блок (даже если это для /) и поместите туда директиву.
Грегл
2
@GregL, этот формат URL - это «относительный к протоколу» URL, он является вполне допустимым способом ссылки на страницы, хотя он не так широко известен. «//domain.com/path» заставляет браузер запрашивать документ с тем же протоколом, который использовался для запроса страницы, содержащей ссылку.
Теро Килканен

Ответы:

11

Есть модуль apache с именем mod_substitute, который может это сделать. Вот короткий пример:

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

Больше информации в документации Apache для mod_substitute .

Дженни Д
источник
Привет, спасибо за предложение, к сожалению, мне не очень повезло на этом пути. Я успешно проверил это за пределами прокси. Похоже, mod_proxy игнорирует его.
ZZ9
Я добавил еще немного информации, которая может оказаться полезной.
Дженни Д
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 контента, как у вас в примере.

g491
источник
Я получил HTML 200 на странице, но браузер показывает: Ошибка кодировки содержимого Невозможно отобразить страницу, которую вы пытаетесь просмотреть, потому что она использует недопустимую или неподдерживаемую форму сжатия.
ZZ9
Ах, добавь их в свой VirtualHost. RequestHeader сбрасывает Accept-Encoding, а также RequestHeader устанавливает идентификацию Accept-Encoding
g491
Я обновил свой ответ кое-чем, чтобы попытаться заставить Вашу оригинальную заменяющую линию работать. Я бы порекомендовал попробовать это в первую очередь, так как это проще и может быть то, что происходит.
g491
Обновление для отличного ответа, но сначала я получил другой ответ
ZZ9
1
В моем случае это было сжатие, прибил его. Это сводило меня с ума ... большое спасибо!
Этот бразильский парень