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


11

프록시를 통해 전달 된 모든 페이지의 내용을 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>

혼란 스러워요. HTML a태그 에서 온 것 같습니다 . 해당 링크를 클릭하면 링크를 따르는 웹 브라우저가 아닌 UNC를 열려고하는 파일 브라우저 (Windows 탐색기)가 생성 될 수 있습니다. HTML 텍스트에서 해당 문자열을 바꾸려고합니까?
GregL

그들은 제대로 작동합니다. 그러나 일단 방화벽 뒤에 놓으면 CSS와 이미지에 404를 얻을 수 있습니다. 일반적으로 모든 것은 200
ZZ9를

IIS 서버의 링크 태그에서 온 것입니다. <link href = "// fqdn / asset"
ZZ9

UNC 경로를 link태그로 제공 할 수 있다고 생각하지 않습니다 . 당신이 할 수 있다면, 나는 그것이 좋은 생각이라고 말할 수 없습니다. 어쨌든 그것은 당신의 질문이 아닙니다. 아파치에 따라 문서substitute지침은 내부에서만 유효 Directory블록 또는 .htaccess파일입니다. <location>/에 대한 경우에도 블록을 작성 하고 지시문을 거기에 넣으십시오.
GregL

2
@GregL,이 URL 형식은 "프로토콜 기준"URL이며, 일반적으로 알려지지는 않았지만 페이지에 연결하는 완벽한 방법입니다. "//domain.com/path"는 브라우저가 링크를 포함하는 페이지를 요청하는 데 사용 된 것과 동일한 프로토콜로 문서를 요청하게합니다.
Tero Kilkanen

답변:


11

이것을 할 수있는 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 아파치 문서에 더 많은 정보가 있습니다 .


안녕하세요, 제안 주셔서 감사합니다, 불행히도 나는이 길을 많이 운이 없었습니다. 그래도 프록시 외부에서 성공적으로 테스트했습니다. mod_proxy가 무시하는 것처럼 보입니다.
ZZ9

도움이 될만한 정보를 더 추가했습니다.
Jenny D

1
고마워요, 이것은 작동합니다. Apache가 /etc/httpd/conf.d/에서 .conf (vhost.bak)로 끝나지 않은 내 파일의 백업을 선택하는 데 문제가있는 것으로 나타났습니다.
ZZ9

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이 표시되지만 브라우저에 다음과 같이 표시됩니다. 콘텐츠 인코딩 오류 유효하지 않거나 지원되지 않는 압축 형식을 사용하여 보려고하는 페이지를 표시 할 수 없습니다.
ZZ9

아, VirtualHost에 추가하십시오. RequestHeader는 Accept-Encoding을 설정 해제하고 RequestHeader는 Accept-Encoding ID를 설정 함
g491

원래 대체 라인이 작동하도록 시도하여 답변을 업데이트했습니다. 시도하는 것이 더 간단하고 진행 중일 수 있으므로 먼저 시도해 보는 것이 좋습니다.
g491

큰 답변을 업데이트했지만 다른 답변이 먼저 작동합니다
ZZ9

1
제 경우에는 압축이었습니다. 그것은 나를 미치게했다 ... 너무 감사합니다!
그 브라질 사람

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.