Penulisan Ulang 302 AppDirect Server URL dengan Proxy Apache di Tengah

8

Saya memiliki pengaturan yang aneh. Ini terlihat seperti ini:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

Pada proksi HTTPS (proksi yang sangat bodoh), sebuah URL muncul seperti https: //proxy.domain.com/app. Itu kemudian diteruskan ke Apache menggunakan HTTP seperti http: //apache.domain.com/app (lewat host proxy.domain.com). Apache kemudian menyetel permintaan secara lokal menggunakan protokol AJP ke ajp: // localhost: 8009 / app /.

Terkadang server aplikasi ingin mengarahkan jalur yang diminta. Misalnya, redirect / app / ke / app / webapp. Jadi, ia mengirimkan 302 kembali ke apache mengarahkan ulang jalan - mungkin sesuatu seperti ajp: // localhost: 8009 / app / webapp. Apache kemudian menulis ulang URL pengalihan ke http: //proxy.domain.com/app/webapp. Proxy HTTPS bodoh, sehingga tidak menganalisis pengalihan dan mengubah http ke https.

Jadi, saya ingin mencari tahu apakah saya dapat mengkonfigurasi Apache untuk menulis ulang 302 redirect URL untuk mengirim pengguna ke https.

Ini adalah konfigurasi yang saya miliki sejauh ini di https.conf Apache:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Saya mencoba menggunakan ProxyPassReverse , tetapi belum dapat menemukan cara memaksanya untuk menulis ulang 302 redirect URL dengan https alih-alih http.

Adakah pikiran?

George
sumber

Jawaban:

9

Saya selalu bergulat dengan masalah selama berjam-jam sebelum menyerah dan memposting pertanyaan - hanya untuk menyelesaikan masalah saya sendiri beberapa menit setelah memposting ...

Bagi mereka yang tertarik, solusinya adalah tidak menggunakan ProxyPassReverse , melainkan menggunakan Header directive - itu mari kita main-main dengan header outbound. Dalam hal ini, saya dapat menangkap tajuk respons Lokasi dan menjalankan regex di atasnya untuk memperbaiki protokol URL:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Voila!

Jika apache mengeluh, mungkin mod_headers belum diaktifkan: a2enmod headers

George
sumber
Tidak perlu mengedit tajuk, gunakan solusi @wondy untuk membuat tomcat tahu tentang protokol LB / RProxy melalui RempteIpValve
Muhammad Hewedy
Saya menggunakan solusi ini. Saya lebih suka melakukan konfigurasi Apache daripada membuat kucing jantan melakukan apa yang saya inginkan!
froderik
3

Saya telah menemukan opsi lain.

Berdasarkan /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat dan Apache ReverseProxyPass mengalihkan ke http daripada https tampaknya beberapa server mengenali header X-Forwarded-Protocol . Seseorang dapat membuat Tomcat mengenalinya dengan menambahkan:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

untuk server.xml.

wodny
sumber
1
Ini adalah solusi terbaik, maka tomcat dirancang untuk bekerja dengan cara ini
Muhammad Hewedy
Saya pikir maksud Anda X-Forwarded-Proto.
Michael Hampton
Saya cukup yakin saya telah menggunakan "Protokol" dan itu berhasil. Tapi itu bulan Maret 2013. Saya bisa melihat kedua versi telah digunakan selama beberapa waktu. Seperti yang saya lihat sementara itu RFC 7239 baru telah ditulis (Juni 2014). Mungkin versi "Proto" telah menang dan merupakan standar sekarang.
Wodny