쿼리 문자열 매개변수에 지정된 원격 서버를 사용하여 Apache를 역방향 프록시로 구성하는 방법

쿼리 문자열 매개변수에 지정된 원격 서버를 사용하여 Apache를 역방향 프록시로 구성하는 방법

문제:
쿼리 문자열 매개변수에 제거 서버가 지정된 역방향 프록시로 Apache를 구성하려고 합니다.

mywebapp.com에서 사이트를 제공하고 있다고 가정해 보겠습니다. 다음으로 이동했다면http://mywebapp.com/proxy?url=http://www.someothersite.com, 그러면 아파치는 역방향 프록시 역할을 해야 합니다.http://www.someothersite.com. 마찬가지로 다음으로 이동한 경우http://mywebapp.com/proxy?url=https://login.notmysite.com, 그러면 아파치는 역방향 프록시 역할을 해야 합니다.https://login.notmysite.com.

고려사항:
1. 프록시를 통과하도록 응답 HTML의 상대 URL을 다시 작성합니다.
2. 원격 서버에서 리디렉션 응답을 다시 작성합니다. 예를 들어, 사용자가 mywebapp.com/proxy?url=을 요청하는 경우https://login.notmysite.com원격 서버는 다음으로 리디렉션하여 응답합니다.https://login.notmysite.com/, 그러면 사용자의 브라우저에 mywebapp.com/proxy?url=로의 리디렉션이 표시되어야 합니다.https://login.notmysite.com/.
3. http 및 https 지원
4. 쿠키 지원
5. 합리적인 보안. 전 세계 누구에게나 사용할 수 있도록 프록시를 열고 싶지 않습니다. mywebapp.com에서 호스팅되는 사이트의 iframe에서만 사용해야 합니다.

환경:
나는 Apache 2.2.24를 사용하고 있지만 문제를 더 쉽게 해결할 수 있다면 업그레이드할 수 있습니다.

현재 구성:

<VirtualHost 127.0.0.1:8081>
    ServerName www.mywebapp.com
    SSLProxyEngine On

    RewriteEngine on
    RewriteCond %{QUERY_STRING} ^url=(.*)$
    RewriteRule ^/proxy - [E=url:%1]

    RewriteCond %{QUERY_STRING} ^url=(https?://[^:/]+)/?
    RewriteRule ^/proxy - [E=url_host:%1]

    RewriteCond %{QUERY_STRING} ^url=(.*)$
    RewriteRule ^/proxy                %1   [P]

    ProxyPassInterpolateEnv On
    ProxyPassReverse /proxy/ ${url_host} interpolate

    <Location /proxy>
        ProxyHTMLEnable On
        ProxyHTMLInterp On
        ProxyHTMLURLMap /   ${url_host}/ V
        RequestHeader   unset   Accept-Encoding
    </Location>
</VirtualHost>

이 구성은 고려 사항 #1에서는 올바르게 작동하는 것으로 보이지만 고려 사항 #2에서는 장애물에 부딪혔습니다. 일반적으로 ProxyPassReverse 명령을 사용하여 리디렉션을 처리한다는 것을 알고 있지만 쿼리 문자열 매개 변수를 다시 작성하는 방법은 잘 모르겠습니다.

질문:
고려 사항을 고려할 때 Apache가 이 문제를 해결하는 데 적합한 도구입니까?
그렇다면 위의 모든 고려 사항을 충족하도록 Apache 구성을 어떻게 설정합니까?

이것이 큰 질문이라는 것을 알고 있습니다. 고려 사항 중 하나만 충족하는 데 도움이 되는 답변을 제공할 수 있다면 커뮤니티가 볼 수 있도록 위 구성을 업데이트하겠습니다.

답변1

mod_headers가 이를 처리할 수 있습니다.

Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"

expr부분에는 Apache 2.4가 필요합니다.

참고: 나는 이것을 테스트하지 않았습니다.

참고자료:

http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html

답변2

어쩌면 그것을 해결파운드더 쉽고 안전할 것입니다. 하지만 리디렉션이 아니라 역방향 프록시입니다.

또한 작은 PHP 스크립트도 작업을 수행할 수 있습니다...

답변3

귀하의 아이디어에서 가장 큰 문제는 역방향 프록시가 백엔드로 쿠키를 보낼 것으로 예상하지만 클라이언트가 프런트엔드로 쿠키를 보내지 않을 경우(백엔드 쿠키 도메인이 프런트엔드보다 열등하지 않은 경우)입니다.

나는 mod_proxy가 사용하기 너무 어려울 것이라고 제안하고 싶습니다. 이 경우 mod_rewrite를 사용하면 목표에 더 빨리 도달할 수 있습니다.

...하지만 아마도 결함이 있을 가능성이 있는 설계로 문제를 해결하려고 하는 것 같습니다. 아마도 이 솔루션으로 해결하려는 문제에 대해 더 자세히 설명할 수 있다면 좀 더 깔끔한 것을 제안할 수도 있을 것입니다.

관련 정보