Penulisan ulang URL Apache dalam proxy terbalik

12

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?0dan 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?0di bilah alamat dan semua URL serta konten selanjutnya akan disajikan dengan domain server web dan tanpa jellyfishkekacauan.

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 jellyfishdan pergi ke URL root ( http://web-server) memberikan 404 Tidak Ditemukan.

Saya telah menghabiskan banyak waktu untuk mencoba menggunakan mod_rewritedengan dan tanpa [P]benderanya untuk mengatasi ini, tetapi tidak berhasil. Saya kemudian mencoba ProxyPassMatcharahan, 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_securityaturan 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/hometetapi 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?0tetapi 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 homebit URL berasal dari dalam contoh pertama.

Bisakah seseorang mengarahkan saya ke arah yang benar?

Terima kasih, J.

Jeremy Gooch
sumber
Saya telah membuat beberapa kemajuan dalam hal ini, dan sekarang telah diganti ProxyPassMatchdengan penggunaan yang setara mod_rewrite, yang mengatasi tantangan untuk menghapus jellyfishdari 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/
Jeremy Gooch

Jawaban:

10

Beginilah cara saya membuatnya bekerja. Serta perubahan sesuai komentar saya untuk pertanyaan asli saya, saya perlu mengecualikan .jsdan .cssdari aturan yang menambahkan garis miring.

<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>
Jeremy Gooch
sumber
1

Sudahkah Anda mencoba:

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

Atau bahkan lebih sederhana:

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

Saya menulis bagaimana saya berurusan dengan proxy reverse Apache dan Tomcat di sini jika Anda ingin membandingkan / kontras apa yang Anda setup dengan apa yang saya gunakan.

Anda mungkin ingin menambahkan ini untuk menambahkan garis miring pada URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
JakeGould
sumber
Terima kasih banyak untuk jawabannya. Sayangnya, ini hanya menyelesaikan bagian proxy langsung dari masalah. Bagian yang saya lewatkan adalah cara menghapus kata "ubur-ubur" dari visibilitas di bilah alamat peramban klien, sedemikian rupa sehingga http://web-serverdiam-diam diproksi ke http://app-server:8181/jellyfishdan kembali lagi.
Jeremy Gooch