
Apache에서 다음과 같이 역방향 프록시를 설정했습니다.
주소가 www.example.com/folder인 서버 A는 역방향 프록시 서버입니다.
이는 주소가 test.madeupurl.com인 서버 B에 매핑됩니다.
이런 종류의 작품입니다. 그러나 내가 가진 문제는 www.example.com/folder에서 모든 상대 링크가 www.example.com/folder/css/examplefilename이 아닌 www.example.com/css/examplefilename.css 형식이라는 것입니다. CSS
이 문제를 어떻게 해결합니까?
지금까지 내 역방향 프록시는 서버 A(www.example.com)에 다음을 가지고 있습니다.
<Location /folder>
ProxyPass http://test.madeupurl.com
ProxyPassReverse http://test.madeupurl.com
</Location>
답변1
Apache ProxyPassRewrite는 다음에서 받은 응답 본문을 다시 작성하지 않습니다.http://test.example.com, 헤더만(예: 404 페이지로 리디렉션 등).
다양한 대안:
하나) 절대 경로 대신 상대 경로를 사용하도록 내부 앱을 다시 작성합니다. 즉 ../css/style.css
대신에/css/style.css
둘/folder
) test.example.com의 루트가 아닌 동일한 하위 디렉터리에 내부 앱을 재배포합니다 .
삼) 하나와 둘은 일어날 가능성이 거의 없습니다... 운이 좋다면 내부 앱은 하위 디렉터리를 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/
4개) 내부 앱을 위한 별도의 하위 도메인을 만들고 모든 것을 간단히 역방향 프록시합니다.
<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>
다섯) 때로는 개발자가 전혀 모르고 응용 프로그램에서 절대 URL을 생성할 뿐만 아니라 URL에 호스트 이름 부분을 포함하도록 하여 결과 HTML 코드가 다음과 같게 되는 경우가 있습니다 <img src=http://test.example.com/icons/logo.png>
.
ㅏ) 분할 수평 DNS 및 시나리오 4의 콤보 솔루션을 사용할 수 있습니다. 내부 및 외부 사용자 모두 test.example.com을 사용하지만 내부 DNS는 test.example.com 서버의 IP 주소를 직접 가리킵니다. 외부 사용자의 경우 test.example.com의 공개 기록은 공개 웹 서버의 IP 주소를 가리킵니다.www.example.com그런 다음 솔루션 4를 사용할 수 있습니다.
비) 실제로 test.example.com에 대한 프록시 요청뿐만 아니라응답 본문을 다시 작성사용자에게 전송되기 전에. (일반적으로 프록시는 HTTP 헤더/응답만 다시 작성합니다). 아파치 2.2의 mod_substitute. 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>
늦은 편집
육) 때때로 개발자는 애플리케이션이 역방향 프록시 뒤에 있는 배포를 위해 특별히 특수 애플리케이션 설정을 제공합니다.그런 다음 응용 프로그램은 프로토콜, 사이트 이름 및 사용자가 사용해야 하는 URI 경로를 사용하여 자체 참조 URL을 생성하도록 구성할 수 있습니다.그런 다음 호스트 이름, 프로토콜 및/또는애플리케이션이 감지하는 URI. external URL
, 와 같은 용어를 기대합니다 site URL
. 그러면 Apache에서 아무것도 해결할 필요가 없습니다.
답변2
보완책으로는HBruijn님의 답변(당신이 솔루션을 선택하는 경우)(삼)"ProxyPass"를 사용해야 할 수도 있습니다.mod_proxy_htmlHTML 페이지의 일부 URL을 다시 작성합니다.
참조.역방향 프록시를 사용하여 상대 URL을 올바르게 처리하는 방법몇 가지 예를 들면.
적용된 예로서 다음은 ProxyHTMLURLMap
모든 것을 전달하는 규칙을 사용하여 Apache를 구성하는 방법입니다.귀하의 도메인 이름.com/pad너의 ~에게에테르패드포트 9001에서 로컬로 실행되는 인스턴스:
<Location /pad>
ProxyPass http://localhost:9001 retry=0
# retry=0 => avoid 503's when restarting etherpad-lite
ProxyPassReverse http://localhost:9001
SetOutputFilter proxy-html
ProxyHTMLURLMap http://localhost:9001
</Location>
RewriteRule ^/pad$ /pad/ [R]
답변3
역방향 프록시를 만들려면 다음 방법을 사용할 수 있습니다.
1. mod_proxy_html을 설치합니다.
yum install mod_proxy_html
mod_proxy_html 모듈 로드
LoadModule proxy_html_module modules/mod_proxy_html.so
그리고 다음 설정을 사용하십시오
ProxyRequests off ProxyPass /folder/ http://test.madeupurl.com ProxyHTMLURLMap http://test.madeupurl.com /folder <Location /folder/> ProxyPassReverse / ProxyHTMLEnable On ProxyHTMLURLMap / /folder/ RequestHeader unset Accept-Encoding </Location>
이 도움을 바랍니다.