역방향 프록시를 사용하여 상대 URL을 올바르게 처리하는 방법

역방향 프록시를 사용하여 상대 URL을 올바르게 처리하는 방법

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
  1. mod_proxy_html 모듈 로드

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. 그리고 다음 설정을 사용하십시오

    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>  
    

이 도움을 바랍니다.

관련 정보