Saya memiliki pengaturan proxy terbalik sebagai berikut di Apache:
Server A dengan alamat www.example.com/folder adalah server proxy terbalik.
Ini peta ke: Server B dengan alamat test.madeupurl.com
Jenis pekerjaan ini. Tetapi masalah yang saya miliki adalah, pada www.example.com/folder, semua tautan relatif adalah dari bentuk www.example.com/css/examplefilename.css alih-alih www.example.com/folder/css/examplefilename. css
Bagaimana cara saya memperbaikinya?
Sejauh ini proxy terbalik saya memiliki ini di Server A (www.example.com):
<Location /folder>
ProxyPass http://test.madeupurl.com
ProxyPassReverse http://test.madeupurl.com
</Location>
linux
apache-2.2
reverse-proxy
Pekerja keras
sumber
sumber
Jawaban:
Apache ProxyPassRewrite tidak menulis ulang badan tanggapan yang diterima dari http://test.example.com , hanya header (seperti pengalihan ke halaman 404 dan semacamnya).
Sejumlah alternatif:
Satu ) Tulis ulang aplikasi internal untuk menggunakan jalur relatif alih-alih absolut. yaitu
../css/style.css
bukannya/css/style.css
Dua ) Gunakan kembali aplikasi internal di subdirektori yang sama
/folder
daripada di root test.example.com.Tiga ) Satu dan dua sering tidak mungkin terjadi ... Jika Anda beruntung aplikasi internal hanya menggunakan dua atau tiga subdirektori dan itu tidak digunakan di situs utama Anda , cukup tulis banyak baris ProxyPass:
Empat ) Buat subdomain terpisah untuk aplikasi internal dan cukup membalikkan semua proxy:
Lima ) Terkadang pengembang
sama sekali tidak tahu danmemiliki aplikasi mereka tidak hanya menghasilkan mutlak URL tetapi bahkan termasuk bagian hostname di mereka URL dan kode HTML yang dihasilkan terlihat seperti ini:<img src=http://test.example.com/icons/logo.png>
.A ) Anda dapat menggunakan solusi kombo DNS split horizon dan skenario 4. Pengguna internal dan eksternal menggunakan test.example.com, tetapi DNS internal Anda menunjuk langsung ke alamat ip server test.example.com. Untuk pengguna eksternal, catatan publik untuk test.example.com menunjuk ke alamat-ip server web publik Anda www.example.com dan Anda kemudian dapat menggunakan solusi 4.
B ) Anda benar-benar bisa mendapatkan apache ke tidak hanya permintaan proxy untuk test.example.com, tetapi juga menulis ulang badan respons sebelum akan dikirimkan ke pengguna Anda. (Biasanya proxy hanya menulis ulang HTTP header / response). mod_substitute di apache 2.2. Saya belum menguji apakah tumpukannya baik dengan mod_proxy, tapi mungkin yang berikut ini berfungsi:
sumber
<img src=/folder/icons/button.png>
di gilirannya akan ditangkap olehProxyPass /folder/ http://test.madeupurl.com/folder/
arahan.href="../css/custom.css"
dan tidakhref="/css/custom.css"
. Ketika pengguna internet mengambil halaman, URL akan menjadi www.example.com/folder/content/index.html. URL untuk css akan menjadi:www.example.com/folder/content/../css/custom.css
yang sebenarnyawww.example.com/folder/css/custom.css
akan diteruskan ketest.madeupurl.com/css/custom.css
.Sebagai pelengkap jawaban HBruijn , jika Anda memilih solusi (3) "ProxyPass", Anda mungkin juga harus menggunakan mod_proxy_html untuk menulis ulang beberapa URL di halaman HTML Anda.
lih. Cara menangani url relatif dengan benar dengan proxy terbalik untuk beberapa contoh.
Sebagai contoh terapan, di sini adalah bagaimana Anda dapat mengkonfigurasi Apache menggunakan
ProxyHTMLURLMap
aturan untuk meneruskan segala sesuatu di your-domain-name.com/pad untuk Anda EtherPad misalnya berjalan secara lokal pada port 9001:<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]
sumber
SetOutputFilter
&ProxyHTMLURLMap
.Anda dapat menggunakan cara berikut untuk membuat proxy terbalik:
1. Instal mod_proxy_html
Muat modul mod_proxy_html
Dan gunakan pengaturan berikut
Semoga bantuan ini.
sumber