Saya menjalankan aplikasi Sinatra di belakang penumpang / nginx. Saya mencoba membuatnya merespons panggilan http dan https. Masalahnya adalah, ketika keduanya didefinisikan di blok server, panggilan https ditanggapi secara normal tetapi http menghasilkan kesalahan 400 "Permintaan HTTP biasa telah dikirim ke port HTTPS". Ini untuk halaman statis jadi saya kira Sinatra tidak ada hubungannya dengan ini. Ada ide tentang cara memperbaikinya?
Berikut blok servernya:
server {
listen 80;
listen 443 ssl;
server_name localhost;
root /home/myhome/app/public;
passenger_enabled on;
ssl on;
ssl_certificate /opt/nginx/ssl_keys/ssl.crt;
ssl_certificate_key /opt/nginx/ssl_keys/ssl.key;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
location /static {
root /home/myhome/app/public;
index index.html index.htm index.php;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 /500.html;
access_log /home/myhome/app/logs/access.log;
error_log /home/myhome/app/logs/error.log;
}
my.example.com:443
tidak berfungsi. Mengubah itu malahhttps://my.example.com
berhasil. Aneh, tidak pernah mengalami masalah ini dengan apache.ssl on;
memberi tahu NGINX ke server SETIAP konten melalui SSL. Gunakan tanda "ssl" di akhirlisten 443;
mis.listen 443 ssl;
Jika server Anda memberikan lalu lintas http dan https, dan hapusssl on;
perintah.Jawaban:
Saya mengalami masalah serupa. Ia bekerja di satu server dan tidak di server lain dengan konfigurasi Nginx yang sama. Temukan solusi yang dijawab oleh Igor di sini http://forum.nginx.org/read.php?2,1612,1627#msg-1627
Iya. Atau Anda dapat menggabungkan server SSL / non-SSL dalam satu server:
sumber
ssl off;
ssl on;
(tidak perlu menambahkan ssl). Juga, karena saya tidak ingat versi Nginx, tidak ada lagi kebutuhan untuk digunakandefault
padalisten 443
line. Jadi konfigurasi OP baik-baik saja, hanya perlu menghapusssl on
dan seharusnya berfungsi.ssl on
. @ MichaelJ.Evans jawaban di bawah ini adalah solusi yang jauh lebih baik.Jawaban di atas salah karena sebagian besar pengujian 'apakah HTTPS koneksi ini' untuk memungkinkan penyajian halaman melalui http terlepas dari keamanan sambungan.
Jawaban aman menggunakan halaman kesalahan pada kode kesalahan http 4xx NGINX khusus untuk mengarahkan klien untuk mencoba kembali permintaan yang sama ke https. (seperti diuraikan di sini /server/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )
OP harus menggunakan:
sumber
nginx['custom_gitlab_server_config'] = "error_page 497 https://$host:$server_port$request_uri;"
berhasilKesalahan mengatakan itu semua sebenarnya. Konfigurasi Anda memberi tahu Nginx untuk mendengarkan pada port 80 (HTTP) dan menggunakan SSL. Saat Anda mengarahkan browser ke
http://localhost
, browser mencoba menghubungkan melalui HTTP. Karena Nginx mengharapkan SSL, Nginx mengeluh dengan kesalahannya.Solusinya sangat sederhana. Anda membutuhkan dua
server
bagian:sumber
Saya mengalami masalah yang persis sama, saya memiliki jenis konfigurasi yang sama dengan contoh Anda dan saya berhasil melakukannya dengan menghapus baris:
ssl on;
Mengutip dok:
sumber
Menurut artikel wikipedia tentang kode status . Nginx memiliki kode kesalahan khusus ketika lalu lintas http dikirim ke port https (kode kesalahan 497)
Dan menurut dokumen nginx di error_page , Anda dapat menentukan URI yang akan ditampilkan untuk kesalahan tertentu.
Dengan demikian kita dapat membuat uri yang akan dikirim klien ketika kode kesalahan 497 dimunculkan.
nginx.conf
Namun jika klien membuat permintaan melalui metode lain kecuali GET, permintaan itu akan diubah menjadi GET. Jadi untuk mempertahankan metode permintaan yang masuk melalui klien; kami menggunakan pengalihan pemrosesan kesalahan seperti yang ditunjukkan dalam dokumen nginx di error_page
Dan itulah mengapa kami menggunakan
301 =307
pengalihan.Dengan menggunakan file nginx.conf yang ditunjukkan di sini, kita dapat memiliki http dan https yang didengarkan pada port yang sama
sumber
Berikut adalah contoh untuk mengkonfigurasi HTTP dan HTTPS di blok konfigurasi yang sama dengan dukungan ipv6 . Konfigurasi diuji di Server Ubuntu dan NGINX / 1.4.6 tetapi ini harus bekerja dengan semua server.
Jangan sertakan
ssl on
yang dapat menyebabkan400
error. Konfigurasi di atas seharusnya berfungsiSemoga ini membantu!
sumber
jika menggunakan phpmyadmin tambahkan: fastcgi_param HTTPS on;
sumber
Sebenarnya Anda bisa melakukan ini dengan:
Ini memecahkan masalah saya dalam menggunakan nginxvhosts; sekarang saya dapat menggunakan SSL dan HTTP biasa. Bekerja bahkan dengan port gabungan.
sumber