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?0
ve 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?0
adres çubuğunda gösterilecek şekilde değişecek ve sonraki tüm URL'lere ve içeriğe web sunucusunun etki alanında ve jellyfish
karmaş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 jellyfish
ve kök URL'ye ( http://web-server
) gidilmesi için 404 Bulunamadı.
Bu sorunu çözmek için bayrağını kullanarak mod_rewrite
ve kullanmadan çalışmak için çok zaman harcadım [P]
, ancak başarılı olamadım. Daha sonra ProxyPassMatch
yö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_security
yanlış 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/home
ama 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?0
ama 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 home
ilk ö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.
ProxyPassMatch
eş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_rewrite
jellyfish
# 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/