프록시를 통해 전달 된 모든 페이지의 내용을 URL에 대해 mod_rewrite를 사용하는 것과 비슷한 방식으로 바꿀 수 있습니까? 대체 문서는 명확하지 않습니다.
절대 경로가있는 리버스 프록시 페이지가 있습니다. 사이트가 손상됩니다. 그것들은 교체해야하며 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
변경 후 구성 :
<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라는 아파치 모듈이 있습니다. 다음은 간단한 예입니다.
<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를 다시 시작하지 않았다면 반드시 수행해야하지만 이미 그렇게 한 경우 사용자 정의 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://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypassreverse 에 따르면 ‘
프록시와 일치하도록 HTML 내용을 다시 쓰려면 mod_proxy_html을로드하고 활성화해야합니다.