是否有可能取代通过代理传递的每个页面上的内容,类似于如何使用mod_rewrite URL?

是否有可能取代通过代理传递的每个页面上的内容,类似于如何使用mod_rewrite URL? 替代文件不清楚。

我有一些页面我是反向代理,有绝对path。 这打破了网站。 他们需要更换和像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> 

上述两种方法都不能替代HTMLstring

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

有一个名为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文档的更多信息。

如果你没有重新启动Apache,一定要这样做,但是如果你已经这样做了,你可以尝试一个全局输出filter来运行一个自定义的PHP脚本来做replace,看看是否由于某种原因解决了它。

编辑:根据您的评论,这可能是替代品不工作,因为内容被压缩。 要closures压缩,请将这些行添加到您的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内容,如你在你的例子。

根据重写头文件的https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse ,使用“

要重写HTML内容以匹配代理,您必须加载并启用mod_proxy_html。

因为你可以使用https://serverfault.com/users/282679/g491中&#x7684; mod_substitute,但是如果你正在尝试replacehref链接中的主机名,那么使用mod_proxy_html会更快。