Apache ProxyPassRewrite는 http://test.example.com 에서 수신 한 응답 본문을 다시 쓰지 않고 헤더 만 (404 페이지로 리디렉션하는 등) 다시 작성합니다 .
여러 대안 :
하나 ) 절대 대신 상대 경로를 사용하도록 내부 앱을 다시 작성하십시오. 즉 ../css/style.css
대신/css/style.css
2 ) /folder
test.example.com의 루트가 아닌 동일한 하위 디렉토리에 내부 앱을 재배치합니다 .
3 ) 1과 2는 종종 발생하지 않을 것입니다 ... 운이 좋으면 내부 앱이 2 개 또는 3 개의 하위 디렉토리 만 사용 하고 기본 사이트 에서 사용되지 않는 하위 디렉토리 를 사용하는 경우 간단히 ProxyPass 행을 작성하십시오.
# Expose Internal App to the internet.
ProxyPass /externalpath/ http://test.example.com/
ProxyPassReverse /externalpath/ http://test.example.com/
# Internal app uses a bunch of absolute paths.
ProxyPass /css/ http://test.example.com/css/
ProxyPassReverse /css/ http://test.example.com/css/
ProxyPass /icons/ http://test.example.com/icons/
ProxyPassReverse /icons/ http://test.example.com/icons/
Four ) 내부 앱에 대해 별도의 하위 도메인을 만들고 모든 것을 리버스 프록시하십시오.
<VirtualHost *:80>
ServerName app.example.com/
# Expose Internal App to the internet.
ProxyPass / http://test.internal.example.com/
ProxyPassReverse / http://test.internal.example.com/
</VirtualHost>
5 ) 개발자 는 전혀 단서 가없고 응용 프로그램에서 절대 URL을 생성 할뿐 아니라 URL에 호스트 이름 부분을 포함 시키며 결과 HTML 코드는 다음과 같습니다 <img src=http://test.example.com/icons/logo.png>
.
A ) 수평 분할 DNS 및 시나리오 4의 콤보 솔루션을 사용할 수 있습니다. 내부 및 외부 사용자 모두 test.example.com을 사용하지만 내부 DNS는 test.example.com 서버의 ip-address를 직접 가리 킵니다. 외부 사용자의 경우 test.example.com의 공개 레코드는 공개 웹 서버 www.example.com의 ip 주소를 가리키고 솔루션 4를 사용할 수 있습니다.
B ) 실제로 test.example.com에 대한 프록시 요청뿐만 아니라 응답 본문이 사용자에게 전송되기 전에 다시 작성할 수 있습니다. 일반적으로 프록시는 HTTP 헤더 / 응답 만 다시 작성합니다. 아파치의 mod_substitute 2.2. mod_proxy와 제대로 스택되는지 테스트하지는 않았지만 다음과 같이 작동합니다.
<Location /folder/>
ProxyPass http://test.example.com/
ProxyPassReverse http://test.example.com/
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|test.example.com/|www.example.com/folder/|i"
</Location>