Proxy
是否可以替換通過代理傳遞的每個頁面上的內容,類似於 mod_rewrite 用於 URL 的方式?
是否可以替換通過代理傳遞的每個頁面上的內容,類似於 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"
如果您還沒有重新啟動 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 內容,就像您在範例中所做的那樣。