프록시를 통해 전달 된 모든 페이지의 내용을 URL에 대해 mod_rewrite를 사용하는 것과 비슷한 방식으로 바꿀 수 있습니까? CustomLog “/var/log/proxy/jpuat_prox_access_log”

프록시를 통해 전달 된 모든 페이지의 내용을 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을로드하고 활성화해야합니다.


답변