Можно ли заменить содержимое на каждой странице, передаваемой через прокси, подобно тому, как 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?link
тегах. Если вы можете, я не могу сказать, что это была бы хорошая идея .. В любом случае, это не ваш вопрос. Согласно документации Apache ,substitute
директива действует только внутриDirectory
блоков или.htaccess
файлов. Попробуйте создать<location>
блок (даже если это для /) и поместите туда директиву.Ответы:
Есть модуль apache с именем mod_substitute, который может это сделать. Вот короткий пример:
Или, в сочетании с mod_proxy:
Больше информации в документации Apache для mod_substitute .
источник
Если вы еще не перезапустили Apache, обязательно сделайте это, но если вы уже сделали это, вы можете попробовать глобальный выходной фильтр, который запускает пользовательский скрипт PHP, чтобы выполнить замену, просто чтобы посмотреть, решает ли это по какой-то причине. ,
РЕДАКТИРОВАТЬ: на основании вашего комментария, может быть, что замена не работает, потому что содержимое сжато. Чтобы отключить сжатие, добавьте эти строки в ваш VirtualHost:
Если это не сработает, попробуйте следующее:
Добавьте их в свой conf, обновляя пути, конечно:
В proxyfilter.php есть код, подобный следующему:
Если это работает, то сузьте фокус этого до простого текстового / html контента, как у вас в примере.
источник
Согласно https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse, который переписывает заголовки, вы используете "
источник