Saya menggunakan Apache di depan aplikasi yang di-host Karaf (Apache dan Karaf berada di server terpisah). Saya ingin Apache beroperasi sebagai proxy terbalik dan juga menyembunyikan bagian dari URL.
URL untuk mendapatkan halaman masuk aplikasi langsung dari server aplikasi http://app-server:8181/jellyfish
. Halaman dilayani oleh instance Jetty yang berjalan di dalam Karaf. Tentu saja, perilaku ini biasanya akan diblokir oleh firewall untuk semua hal kecuali server proxy terbalik.
Dengan firewall dimatikan, jika Anda menekan URL ini maka Jetty memuat halaman login. Bilah alamat browser berubah dengan benar http://app-server:8181/jellyfish/login?0
dan semuanya berfungsi.
Yang saya inginkan adalah http://web-server
(yaitu dari root) untuk memetakan ke Jetty pada server aplikasi dengan nama app ( jellyfish
) ditekan. mis. Peramban akan berubah untuk tampil http://web-server/login?0
di bilah alamat dan semua URL serta konten selanjutnya akan disajikan dengan domain server web dan tanpa jellyfish
kekacauan.
Saya bisa membuat Apache beroperasi sebagai proxy terbalik sederhana, menggunakan konfigurasi berikut (snippet): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... tetapi ini membutuhkan URL browser untuk memuat jellyfish
dan pergi ke URL root ( http://web-server
) memberikan 404 Tidak Ditemukan.
Saya telah menghabiskan banyak waktu untuk mencoba menggunakan mod_rewrite
dengan dan tanpa [P]
benderanya untuk mengatasi ini, tetapi tidak berhasil. Saya kemudian mencoba ProxyPassMatch
arahan, tetapi sepertinya saya juga tidak bisa mengerti.
Inilah konfigurasi saat ini, seperti yang dimuat ke /etc/apache2/sites-available/
dalam server web. Perhatikan bahwa ada direktori gambar yang dihosting secara lokal. Saya juga menjaga mod_rewrite proxy exploit protection dan saya menekan beberapa mod_security
aturan yang memberikan false positive.
<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>
Jika saya pergi ke http://web-server
, saya diarahkan ke http://web-server/jellyfish/home
tetapi ini memberikan 404, dengan keluhan tentang mencoba mengakses /jellyfish/jellyfish/home
- NB bilah alamat browser tidak mengandung ganda /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
Dan, jika saya pergi ke http://web-server/login
, saya diarahkan ke http://web-server/jellyfish/login?0
tetapi ini memberikan 404, dengan keluhan tentang mencoba mengakses /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Jadi, saya kira saya entah bagaimana melewati peraturan dua kali. Saya juga sedikit bingung ke mana home
bit URL berasal dari dalam contoh pertama.
Bisakah seseorang mengarahkan saya ke arah yang benar?
Terima kasih, J.
ProxyPassMatch
dengan penggunaan yang setaramod_rewrite
, yang mengatasi tantangan untuk menghapusjellyfish
dari URL. Saya sekarang melihat ke sejumlah 404 yang kemudian muncul sehubungan dengan elemen yang mendasarinya seperti komponen Wicket yang dibutuhkan oleh Karaf. Berikut cuplikan kode:# 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/