是否有可能替换通过代理传递的每个页面上的内容,类似于将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

更改后的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>

我糊涂了。看起来好像是来自HTML a标记。单击该链接可能不会导致该链接后面的Web浏览器,而是一个文件浏览器(Windows资源管理器)试图打开UNC。您是否要替换HTML文本中的字符串?
GregL 2015年

他们的网站正常工作。但是,一旦将其放在防火墙后面,我们当然会在一堆CSS和图像上得到404。通常来说,每件事都会得到200
ZZ9

它们来自IIS服务器上的链接标记<link href =“ // fqdn / asset”
ZZ9 2015年

我认为您不能在link标记中提供UNC路径。如果可以的话,我不能说这是个好主意。无论如何,这不是您的问题。根据Apache 文档,该substitute指令仅在Directory块或.htaccess文件内部有效。尝试创建一个<location>块(即使它是用于/),然后将指令放入其中。
GregL 2015年

2
@GregL,这种URL格式是“相对于协议”的URL,虽然不是众所周知,它是链接到页面的完全有效的方法。“ //domain.com/path”使浏览器以与用于请求包含链接的页面相同的协议来请求文档。
Tero Kilkanen 2015年

Answers:


11

有一个名为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"

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


嗨,谢谢你的建议,不幸的是我没有走这条路。我已经在代理之外成功地对其进行了测试。看来mod_proxy忽略了它。
ZZ9 2015年

我添加了一些更多的信息可能会有所帮助。
珍妮·D

1
非常感谢,这可行。事实证明,Apache在/etc/httpd/conf.d/中提取了我的文件备份(并非以.conf(vhost.bak)结尾)是一个小故障。
ZZ9 2015年

7

如果您尚未重启Apache,请确保这样做,但是如果您已经这样做,则可以尝试运行一个运行自定义PHP脚本的全局输出过滤器进行替换,以查看是否由于某种原因而解决了该问题。

编辑:根据您的评论,可能是因为内容已压缩,替代项无法使用。要关闭压缩,请将这些行添加到您的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内容上。


我在页面上看到HTML 200,但浏览器显示:Content Encoding Error无法显示您尝试查看的页面,因为它使用了无效或不受支持的压缩形式。
ZZ9 2015年

嗯,将它们添加到您的VirtualHost中。RequestHeader设置了Accept-Encoding,并且RequestHeader设置了Accept-Encoding身份
g491 2015年

我以某种方式更新了答案,以尝试使您的原始替代产品线正常工作。我建议先尝试一下,因为它比较容易尝试,可能正在发生。
g491 2015年

更新为一个伟大的答案,但我得到了对方的回答工作第一
ZZ9

1
就我而言,这是压迫,钉牢了。这让我发疯了...非常感谢!
这位巴西佬

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.