是否可以替换通过代理传递的每个页面上的内容,类似于 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
更改后的配置:
<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>
答案1
有一个名为 mod_substitute 的 apache 模块可以做到这一点。这是一个简短的例子:
<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"
更多信息请访问mod_substitute 的 Apache 文档。
答案2
如果您尚未重新启动 Apache,请务必执行此操作,但如果您已经这样做了,您可以尝试使用全局输出过滤器,运行自定义 PHP 脚本来进行替换,只是为了看看是否能解决某种原因。
编辑:根据您的评论,可能是因为内容被压缩,所以替代无法正常工作。要关闭压缩,请将以下几行添加到您的 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 内容。
答案3
根据https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse重写标题,你使用“
要重写 HTML 内容以匹配代理,您必须加载并启用 mod_proxy_html。