Proxy

是否可以替換通過代理傳遞的每個頁面上的內容,類似於 mod_rewrite 用於 URL 的方式?

  • June 26, 2017

是否可以替換通過代理傳遞的每個頁面上的內容,類似於 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>

有一個名為 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,請務必這樣做,但如果您已經這樣做了,您可以嘗試執行自定義 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 內容,就像您在範例中所做的那樣。

引用自:https://serverfault.com/questions/684359