리버스 프록시에서 Apache URL 재 작성


12

Karaf에서 호스팅하는 응용 프로그램 앞에 Apache를 배포하고 있습니다 (Apache와 Karaf는 별도의 서버에 있음). Apache가 리버스 프록시로 작동하고 URL의 일부를 숨기고 싶습니다.

앱 서버에서 직접 애플리케이션의 로그인 페이지를 가져 오는 URL은 http://app-server:8181/jellyfish입니다. Karaf 내에서 실행되는 Jetty 인스턴스가 페이지를 제공합니다. 물론이 동작은 일반적으로 역방향 프록시 서버를 제외한 모든 방화벽에 의해 방화벽에 의해 차단됩니다.

방화벽을 끈 상태에서이 URL에 도달하면 Jetty가 로그인 페이지를로드합니다. 브라우저의 주소 표시 줄이 올바르게 변경 http://app-server:8181/jellyfish/login?0되고 모든 것이 작동합니다.

내가 원하는 것은 http://web-server(즉, 루트에서) 앱 이름 ( jellyfish)이 억제 된 앱 서버의 Jetty에 매핑 하는 것입니다. 예를 들어, 브라우저는 http://web-server/login?0주소 표시 줄 에 표시되도록 변경 되며 모든 후속 URL 및 컨텐츠는 웹 서버의 도메인과 함께 jellyfish혼란 없이 제공 됩니다.

다음 구성 (스 니펫)을 사용하여 Apache가 간단한 리버스 프록시로 작동하도록 할 수 있습니다.

ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/

...하지만 브라우저의 URL을 포함 jellyfish해야하고 루트 URL ( http://web-server)로 이동하면 404를 찾을 수 없습니다.

나는이 문제를 해결하기 위해 깃발을 사용하거나 사용 mod_rewrite하지 않고 많은 시간을 [P]보냈지 만 성공하지 못했습니다. 그런 다음 ProxyPassMatch지시문 을 시도했지만 그 어느 것도 올바르게 얻을 수없는 것 같습니다.

/etc/apache2/sites-available/웹 서버에 로드 된 현재 구성은 다음과 같습니다 . 로컬로 호스팅 된 이미지 디렉토리가 있습니다. 또한 mod_rewrite 프록시 악용 방지 기능을 유지했으며 mod_security잘못된 긍정을주는 몇 가지 규칙을 억제하고 있습니다.

<VirtualHost *:80>
    ServerAdmin admin@drummer-server
    ServerName drummer-server

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /images/ "/var/www/images/"

    RewriteEngine On
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    ProxyPass /images !

    ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
    ProxyPassReverse / http://granny-server:8181/jellyfish

    ProxyPreserveHost On

    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

</VirtualHost>

로 이동 http://web-server하면 리디렉션 http://web-server/jellyfish/home되지만 404를 제공합니다. /jellyfish/jellyfish/homeNB 에 액세스하려고 시도 하면 브라우저의 주소 표시 줄에 이중이 포함되어 있지 않습니다 /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

그리고로 이동 http://web-server/login하면 리디렉션 http://web-server/jellyfish/login?0되지만 액세스 시도에 대한 불만과 함께 404가 발생합니다 /jellyfish/jellyfish/login.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

그래서 나는 어떻게 든 규칙을 두 번 통과하고 있다고 생각합니다. 또한 home첫 번째 예제에서 URL 의 비트 가 어디에서 나오는지 약간 기쁘게 생각합니다 .

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

고마워, J.


나는 이것에 대해 약간의 진전을 보였고 이제 URL에서 제거 해야하는 문제를 해결 ProxyPassMatch하는를 사용하여 동등한 것으로 대체 mod_rewrite했습니다 jellyfish. 이제 Karaf에 필요한 Wicket 구성 요소와 같은 기본 요소와 관련하여 팝업되는 404 수를 조사하고 있습니다. 다음은 코드 스 니펫입니다.# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/
Jeremy Gooch

답변:


10

이것이 내가 작동하게하는 방법입니다. 원래 질문에 대한 내 의견에 따른 변경 사항뿐만 아니라 후행 슬래시를 추가 한 규칙 을 제외 .js하고 제외해야했습니다 .css.

<VirtualHost *:80>
    ServerAdmin admin@localhost
    ServerName mydomain.com
    ServerAlias www.mydomain.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteLog ${APACHE_LOG_DIR}/rewrite.log
    RewriteLogLevel 9

    Alias /images/ "/var/www/images/"

    RewriteEngine On

    # rewrite rule to prevent proxy exploit
    RewriteCond  %{REQUEST_URI}  !^$
    RewriteCond  %{REQUEST_URI}  !^/
    RewriteRule  .*              -    [R=400,L]

    # consolidate non-www requests onto the www subdomain
    RewriteCond  %{HTTP_HOST}    ^yourdomain\.com$
    RewriteRule  ^(.*)           http://www.yourdomain.com/$1  [R=301,L]

    # Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteCond  %{REQUEST_URI}  !^/(.*)(.js|.css)$
    RewriteCond  %{REQUEST_URI}  !(.*)/$
    RewriteRule  ^(.*)$          http://%{HTTP_HOST}$1/ [R=301,L]

    # proxy to the Jellyfish server (ignoring images)
    RewriteCond  %{REQUEST_URI}  !^/(images)(.*)$
    RewriteRule  ^(/.*)$         http://app-server:8181/jellyfish$1  [P]
    ProxyPassReverse  /          http://app-server:8181/jellyfish/

    # suppress mod_security rules that were giving false positives
    SecRuleRemoveById 981059 981060

    <Directory "/var/www/images">
            Options Indexes MultiViews FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all
    </Directory>

</VirtualHost>

1

시도해 보셨습니까?

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

또는 더 간단하게 :

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

내가 사용하는 것과 설정 한 것을 비교 / 대조하려면 여기 에서 Apache 리버스 프록시와 Tomcat 다루는 방법을 썼습니다 .

URL에 후행 슬래시를 추가하려면 다음을 추가하십시오.

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]

답장을 보내 주셔서 감사합니다. 불행히도 이것은 문제의 간단한 프록시 부분 만 해결합니다. 내가 놓친 부분은 클라이언트의 브라우저 주소 표시 줄에서 가시성에서 "jellyfish"라는 단어를 제거하여 http://web-server조용히 http://app-server:8181/jellyfish다시 프록시되도록하는 방법 입니다.
Jeremy Gooch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.