Назад | Перейти на главную страницу

Можно ли заменить контент на каждой странице, прошедшей через прокси, аналогично тому, как mod_rewrite используется для URL-адресов?

Можно ли заменить контент на каждой странице, прошедшей через прокси, аналогично тому, как 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="//uat.site.co.jp/css/css.css

с участием

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

Conf после изменений:

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

Есть модуль 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.

Если вы не перезапустили 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);

Если это сработает, сузьте фокус всего этого до содержимого text / html, как в вашем примере.

В соответствии с https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse который перезаписывает заголовки, вы используете "

Чтобы переписать содержимое HTML в соответствии с прокси, вы должны загрузить и включить mod_proxy_html.