Saya memiliki halaman pendaftaran di subdomain seperti: https://signup.example.com
Seharusnya hanya dapat diakses melalui HTTPS tapi saya khawatir orang akan tersandung melalui HTTP dan mendapatkan 404.
Blok html / server saya di nginx terlihat seperti ini:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
Apa yang bisa saya tambahkan sehingga orang yang pergi untuk http://signup.example.com
diarahkan https://signup.example.com
? (FYI saya tahu ada plugin Rails yang bisa memaksa SSL
tetapi berharap untuk menghindari itu)
nginx
ssl
redirect
ruby-on-rails
Callmeed
sumber
sumber
Jawaban:
Menurut perangkap nginx , sedikit lebih baik untuk menghilangkan tangkapan yang tidak perlu, gunakan
$request_uri
saja. Dalam hal itu, tambahkan tanda tanya untuk mencegah nginx menggandakan argumen permintaan apa pun.sumber
return 301 http://domain.com$request_uri;
return 301...
menyebabkan kesalahan "terlalu banyak pengalihan" sementara metode penulisan ulang benar-benar berfungsi.return 301
tidak berfungsi, kecuali (saya kira) Anda memicu juga untuk URL yang benar, dengan mendengarkan pada kedua port (contoh konfigurasi memicu masalah: ambil serverfault.com/a/474345/29689's jawaban pertama dan hilangkan jika ).Cara terbaik seperti yang dijelaskan dalam petunjuk resmi adalah dengan menggunakan
return
arahan:sumber
301 Moved Permanently
(tautan Anda telah dipindahkan secara permanen) dan juga penulisan ulangproxy_set_header X-Forwarded-Proto https;
listen 443;
di blok yang sama?Ini adalah cara yang benar dan paling efisien jika Anda ingin menyimpannya dalam satu blok server:
Semua yang lain di atas, menggunakan "menulis ulang" atau "jika ssl_protocol" dll lebih lambat dan lebih buruk.
Berikut ini adalah sama, tetapi bahkan lebih efisien, dengan hanya menjalankan penulisan ulang pada protokol http ia menghindari harus memeriksa variabel $ skema pada setiap permintaan. Tapi serius, itu hal kecil sehingga Anda tidak perlu memisahkan mereka.
sumber
Jika Anda menggunakan definisi server HTTP ganda dan HTTPS baru, Anda dapat menggunakan yang berikut:
Ini tampaknya bekerja untuk saya dan tidak menyebabkan pengalihan loop.
Sunting:
Diganti:
dengan garis penulisan ulang Pratik.
sumber
If you are using the new dual HTTP and HTTPS server definition
maka Anda harus memisahkannya.return 301 https://$server_name$request_uri;
karena ini adalah metode yang disukai.Namun varian lain, yang mempertahankan Host: header permintaan dan mengikuti contoh "BAIK" pada perangkap nginx :
Inilah hasilnya. Perhatikan bahwa menggunakan
$server_name
alih-alih$host
akan selalu dialihkan kehttps://site1
.sumber
Note that using $server_name instead of $host would always redirect to https://site1
bukankah itu untuk apa$request_uri
?$request_uri
tidak mengandung nama host atau domain. Dengan kata lain, selalu dimulai dengan karakter "/".Pastikan Anda mengatur 'aman' pada cookie apa pun, atau cookie itu akan dikirim pada permintaan HTTP dan bisa diambil oleh alat seperti Firesheep.
sumber
Ini bekerja lebih baik menurut saya. xxxx merujuk ke IP server Anda. Jika Anda bekerja dengan Plesk 12, Anda dapat melakukannya dengan mengubah file "nginx.conf" di direktori "/var/www/vhosts/system/domain.tld/conf" untuk domain apa pun yang Anda inginkan. Jangan lupa untuk me-restart layanan nginx setelah Anda menyimpan konfigurasi.
sumber
rewrite ^ https://$host$request_uri? permanent;
akan menjadi solusi yang lebih baik karena Anda mungkin memiliki beberapa nama server di vhostSaya pikir ini adalah solusi paling sederhana. Memaksa lalu lintas non-HTTPS dan non-WWW hanya ke HTTPS dan www.
EDIT - Apr 2018: Solusi tanpa IF dapat ditemukan di posting saya di sini: https://stackoverflow.com/a/36777526/6076984
sumber