Чи можна замінити вміст на кожній сторінці, що проходить через проксі, аналогічно тому, як 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>

Я збентежений. Схоже, це з aтегу HTML . Натискання на це посилання, швидше за все, не призведе до того, що веб-браузер слідкує за цим посиланням, а скоріше файловий браузер (Windows Explorer), який намагається відкрити UNC. Чи намагаєтесь ви замінити цей рядок у тексті HTML?
GregL

Вони правильно працюють. Однак, як тільки ми помістимо його за брандмауер, ми, звичайно, отримаємо 404 на купі css та зображень. Зазвичай все отримує 200
ZZ9

Вони з тегів посилань на сервері IIS <link href = "// fqdn / asset"
ZZ9,

Я не думаю, що ви можете надати шляхи UNC у linkтегах. Якщо ви можете, я не можу сказати, що це було б гарною ідеєю. У будь-якому випадку, це не ваше питання. Згідно з документами Apache , substituteдиректива діє лише всередині Directoryблоків або .htaccessфайлів. Спробуйте створити <location>блок (навіть якщо це за /) і покладіть туди директиву.
GregL

2
@GregL, цей формат URL-адреси є "відносно протокольною" URL-адресою, це абсолютно вірний спосіб посилання на сторінки, хоча це не так відомо. "//domain.com/path" змушує браузер запитувати документ із тим самим протоколом, який використовувався для запиту сторінки, що містить посилання.
Tero Kilkanen

Відповіді:


11

Існує модуль apache під назвою mod_supstitute, який може це зробити. Ось короткий приклад:

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


Привіт, дякую за пропозицію, на жаль, мені не пощастило по цьому шляху. Я проте протестував його поза проксі, але успішно. Здається, mod_proxy ігнорує його.
ZZ9

Я додав ще трохи інформації, яка може бути корисною.
Дженні Д

1
Велике спасибі, це працює. Проблема виявилася, коли Apache збирає резервні копії моїх файлів у /etc/httpd/conf.d/, які не закінчилися .conf (vhost.bak).
ZZ9

7

Якщо ви не перезапустили Apache, не забудьте зробити це, але якщо ви вже зробили це, ви можете спробувати глобальний вихідний фільтр, який запускає користувальницький скрипт PHP, щоб зробити вашу заміну просто, щоб побачити, чи вирішує це чомусь. .

EDIT: на основі Вашого коментаря, можливо, заміна не працює, оскільки вміст стиснуто. Щоб вимкнути стиснення, додайте ці рядки до своєї VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity

Якщо це не працює, спробуйте наступне:

Додайте їх до своєї конф., Оновивши контури курсу:

#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-вмісті, як у вашому прикладі.


Я отримую HTML 200 на сторінці, але браузер показує: Помилка кодування вмісту Сторінку, яку ви намагаєтеся переглянути, не може бути показана, оскільки вона використовує недійсну або непідтримувану форму стиснення.
ZZ9

Ах, додайте їх у свій VirtualHost. RequestHeader скасує Accept-Encoding, а також RequestHeader встановить ідентифікацію Accept-Encoding
g491

Я оновив свою відповідь чимось, щоб спробувати змусити свою оригінальну лінію замінника працювати. Я рекомендую спробувати це спершу, як це простіше спробувати, і можливо, що відбувається.
g491

Оновлення для чудової відповіді, але я отримав іншу відповідь, працюючи першим
ZZ9

1
У моєму випадку це було стиснення, прибиття його. Це зводило мене з розуму ... велике спасибі!
Той бразильський хлопець

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.