是否可以替换通过代理传递的每个页面上的内容,类似于 mod_rewrite 用于 URL 的方式?

ZZ9*_*ZZ9 16 rewrite proxy reverse-proxy apache-2.4

是否可以替换通过代理传递的每个页面上的内容,类似于 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>
Run Code Online (Sandbox Code Playgroud)

以上都不适用于替换 HTML 字符串

<link href="//uat.site.co.jp/css/css.css
Run Code Online (Sandbox Code Playgroud)

<link href="//uat.site2uk.co.uk/css/css.css
Run Code Online (Sandbox Code Playgroud)

更改后的 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>
Run Code Online (Sandbox Code Playgroud)

Jen*_*y D 15

有一个名为 mod_substitute 的 apache 模块可以做到这一点。这是一个简短的例子:

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
    Substitute "s/uat.site.co.jp/jp.uat.site2uk.co.uk/ni"
</Location>
Run Code Online (Sandbox Code Playgroud)

或者,当与 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"
Run Code Online (Sandbox Code Playgroud)

Apache 文档中有更多关于 mod_substitute 的信息


g49*_*491 9

如果您还没有重新启动 Apache,请务必这样做,但如果您已经这样做了,您可以尝试运行自定义 PHP 脚本的全局输出过滤器来进行替换,以查看是否出于某种原因解决了它.

编辑:根据您的评论,可能是因为内容被压缩,所以替代品不起作用。要关闭压缩,请将这些行添加到您的 VirtualHost:

RequestHeader unset Accept-Encoding
RequestHeader set Accept-Encoding identity
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请尝试以下操作:

将这些添加到您的 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
Run Code Online (Sandbox Code Playgroud)

在 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);
Run Code Online (Sandbox Code Playgroud)

如果这有效,则将重点缩小到仅文本/html 内容,就像您在示例中所拥有的那样。