Kata pengantar
Pertama: A hanya Port 80 -> Port 443 Menulis Ulang TIDAK AKAN memperbaikinya. Di hampir setiap pertanyaan sebelumnya, utas email, utas forum, dll., Saya telah menemukan ini adalah jawaban bodoh pertama dan di-beo beberapa kali.
Kedua: Ya, saya tahu Anda tidak dapat melayani lalu lintas HTTP dan HTTPS di port yang sama. Bukan itu.
Skenario:
Apache Server meng-hosting beberapa situs melalui multiplikasi port. Port 80 melayani situs publik. Port 443 menyajikan versi aman situs itu.
Ports 7443, 8443, dan 9443 masing-masing melayani situs SSL-Diamankan terpisah.
Jika pengguna salah ketik URL, atau diberi tautan yang tidak valid, katakan http: //hostname.tld: 7443 , mereka diberi halaman konyol berikut:
Alih-alih server hanya mengarahkan mereka ke https: //hostname.tld: 7443 .
Pertanyaan saya adalah, bagaimana dengan nama butthole Zeus Anda dapat memodifikasi perilaku Apache atau pesan kesalahan ini untuk mengarahkan ulang pengguna secara otomatis?
Apache jelas melayani permintaan non-https (untuk menampilkan pesan kesalahan itu) meskipun itu dikonfigurasi untuk HTTPS. Tampaknya sangat bodoh bagi saya untuk tidak hanya melakukan redirect secara default, tapi saya bisa mengerti mengapa mereka mengikuti perilaku yang mereka lakukan, bahkan jika saya tidak setuju dengan itu. Jadi pertanyaan saya adalah: bisakah Anda mengubahnya? Mereka menangani kesalahan DI MANA SAJA, dan dengan Apache sebagai tumpah ruah konfigurasi itu, masuk akal ada beberapa arahan di suatu tempat untuk menangani perilaku ini, tapi saya belum dapat menemukannya dalam beberapa jam bermain-main sejauh ini.
Memperbarui:
Saya telah mencoba berbagai hal termasuk:
menggunakan
ErrorDocument 400
arahan untuk mendapatkan CGI dan skrip PHP yang baru saja dikirimStatus 301
danLocation
tajuk. Ini menghasilkan halaman kosong. MenggunakanErrorDocument 400 https://hostname.tld:7443
hanya menghasilkan link yang ditampilkan pada halaman.Menggunakan hampir setiap kombinasi
mod_rewrite
I atau Google dapat muncul, termasuk pernyataan selimut yang mengarahkan situs sepenuhnya; ini tidak pernah berhasil. Secara harfiah, mereka tidak melakukan apa-apa. Saya menduga bahwa Apache menendang ke kesalahan di atas bahkan sebelum mencoba untuk memproses arahan menulis ulang.
Saya tidak dapat menggunakan pengalihan berbasis port, karena penggunaan port khusus. Saya tidak dapat menggunakan pengalihan berbasis skrip karena mereka tidak pernah dilayani karena ketidakcocokan http / https. Saya hampir bersedia untuk mengubah ini menjadi bug, atau perilaku yang tidak disengaja, tetapi seseorang memiliki pemikiran sebelumnya untuk menempatkan pesan kesalahan yang sangat khusus di sana, mereka tidak repot-repot berpikir bahwa mungkin Anda hanya ingin pergi ke URL yang sudah mereka sediakan ?
sumber
Jawaban:
Saya pikir ini mungkin bug dalam bagaimana Apache 2.2 dan yang lebih rendah menangani keadaan khusus ini.
Tampaknya pada
400 Bad Request
kesalahan pembacaan SSL , Apache 2.2 tidak mengembalikan kode respons HTTP atau header, hanya badan respons HTTP. Saya menguji dengan telnetting ke port 443 dan mengirim:Server segera kembali (untuk saya):
Perhatikan kurangnya kode respons HTTP atau header HTTP apa pun.
Ketika saya melakukan ini ke server Apache 2.4, saya mendapatkan:
Jika saya mengatur baris ErrorDocument seperti yang Anda lakukan:
Lalu saya mendapatkan HTML untuk redirect 302, tapi sekali lagi, tidak ada header. Tanpa 302 redirect response code dan
Location:
header, browser tidak akan mengalihkan.Coba tingkatkan ke Apache 2.4 dan lihat apakah itu berfungsi. Saya telah menguji dan mengonfirmasi dengan setidaknya Apache 2.4.3, tetapi saya belum melalui upaya untuk menemukan secara tepat kapan perilaku ini diperbarui. Saya menduga bahwa dalam sejumlah besar pekerjaan yang mereka lakukan persiapan 2.4, mereka memperbaiki perilaku yang tidak diinginkan sebagai efek samping.
Bug httpd Apache yang relevan:
MEMPERBARUI
Anda dapat memaksa Apache buggy untuk memberi Anda perilaku yang Anda inginkan (pengalihan) dengan meminta skrip mencetak header-nya (yang tidak akan dikirim ke klien), dan kemudian secara manual mencetak lagi header yang Anda inginkan. Berikut skrip Perl dasar yang bekerja di bawah Apache 2.2.22:
Anda harus menyadari bahwa ada alasan lain yang dapat dihasilkan 400 selain hanya berbicara ke port SSL tanpa SSL. Cara mudah untuk menentukan ini adalah dengan mencari
HTTPS
variabel lingkungan. Jika diatur, maka SSL dinegosiasikan dengan benar dan sesuatu yang lain menyebabkan 400 (jangan lakukan trik tajuk ganda jika itu masalahnya). JikaHTTPS
tidak disetel, kembalikan pengalihan Anda seperti di atas.sumber
<javascript
tag dan beruntung dengan pengalihan hacking cara itu, tapi sejauh ini, tidak ada dadu. Tampaknya tidak ada yang bisa ditangani dengan cara yang mengikutiAnda dapat memperbaikinya dengan mod-rewrite. Tetapkan aturan untuk mencocokkan apa pun. Lihat jawaban ini di Stackoverflow
sumber
sites-available
direktori. Bahkan jika Anda hanya mengarahkannya ke omong kosong, atau mengarahkannya ke situs yang berbeda, port yang berbeda, dll., Itu terus memuat 400 Permintaan Buruk itu.