Ters proxy'de Apache URL yeniden yazma


12

Apache'yi Karaf tarafından barındırılan bir uygulamanın önüne dağıtıyorum (Apache ve Karaf ayrı sunucularda). Apache'nin ters proxy olarak çalışmasını ve URL'nin bir kısmını gizlemesini istiyorum.

Uygulamanın giriş sayfasını doğrudan uygulama sunucusundan alacak URL'dir http://app-server:8181/jellyfish. Sayfalar, Karaf içinde çalışan İskele örneği tarafından sunulur. Tabii ki, bu davranış genellikle ters proxy sunucu hariç her şey için güvenlik duvarı tarafından engellenir.

Güvenlik duvarı kapalıyken, bu URL'ye çarparsanız Jetty giriş sayfasını yükler. Tarayıcının adres çubuğu doğru olarak değişir http://app-server:8181/jellyfish/login?0ve her şey çalışır.

Ne istediğim http://web-server(yani kökten jellyfish) bastırılmış app ( ) adı ile uygulama sunucusunda Jetty eşlemek için . Örneğin, tarayıcı http://web-server/login?0adres çubuğunda gösterilecek şekilde değişecek ve sonraki tüm URL'lere ve içeriğe web sunucusunun etki alanında ve jellyfishkarmaşa olmadan sunulacaktır .

Aşağıdaki yapılandırmayı (snippet) kullanarak, Apache'yi basit bir ters proxy olarak çalıştırabilirim:

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

... ancak bu, tarayıcının URL'sinin içermesini jellyfishve kök URL'ye ( http://web-server) gidilmesi için 404 Bulunamadı.

Bu sorunu çözmek için bayrağını kullanarak mod_rewriteve kullanmadan çalışmak için çok zaman harcadım [P], ancak başarılı olamadım. Daha sonra ProxyPassMatchyönergeyi denedim , ama bunu da oldukça doğru göremiyorum.

/etc/apache2/sites-available/Web sunucusuna yüklendiği şekliyle geçerli yapılandırma aşağıdadır . Yerel olarak barındırılan bir resim dizini olduğunu unutmayın. Ben de mod_rewrite proxy istismar koruma tuttu ve mod_securityyanlış pozitif veren birkaç kural bastırmak .

<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>

Eğer gidersem http://web-server, yönlendirilirim http://web-server/jellyfish/homeama bu 404 verir, erişmeye çalışmakla ilgili bir şikayetle /jellyfish/jellyfish/home- NB tarayıcının adres çubuğunda çift içermiyor /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

Ve eğer gidersem http://web-server/login, yönlendirilirim http://web-server/jellyfish/login?0ama bu 404'e erişmeye çalışmaktan şikayet ediyor /jellyfish/jellyfish/login.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

Yani, sanırım kuralları bir şekilde iki kez geçiyorum. Ayrıca homeilk örnekte URL'nin bitinin nereden geldiği konusunda biraz şaşkınım .

Birisi beni doğru yönde gösterebilir mi lütfen?

Teşekkürler, J.


Bu konuda biraz ilerleme kaydettim ve şimdi URL'lerden kaldırma zorluğunu gideren ProxyPassMatcheşdeğer bir kullanımla değiştirdim . Şimdi 404'lere bakıyorum, o zaman Karaf'ın gerektirdiği Wicket bileşenleri gibi altta yatan unsurlarla ilgili olarak ortaya çıkıyor. İşte bir kod snippet'i:mod_rewritejellyfish# 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

Yanıtlar:


10

İşte bu şekilde işe başladım. Benim asıl soruya benim yorumum göre değişir, ben dışlamak için gerekli sıra itibariyle .jsve .cssbir bölü ekledi kuraldan.

<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

Denedin mi:

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

Veya daha da basit:

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

Ben Apache Ters Proxy ve Tomcat ile nasıl başa yazdım buraya ne kurulum kullandığım ne / kontrast karşılaştırmak istiyorum.

URL'ye bir eğik çizgi eklemek için bunu eklemek isteyebilirsiniz:

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

Cevap için çok teşekkürler. Ne yazık ki, bu yalnızca sorunun basit proxy proxy bölümünü çözmektedir. Ben eksik biraz "denizanası" sözcüğü http://web-serversessizce http://app-server:8181/jellyfishve tekrar tekrar proxy alır böylece müşterinin tarayıcı adres çubuğunda görünürlükten kaldırmaktır .
Jeremy Gooch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.