Saya ingin membuat aturan di nginx yang melakukan dua hal:
- Menghapus "www." dari permintaan URI
- Redirect ke "https" jika URI permintaan adalah "http"
Ada banyak contoh cara melakukan masing-masing hal secara individual, tetapi saya tidak dapat menemukan solusi yang melakukan keduanya dengan benar (yaitu tidak membuat redirect loop dan menangani semua case dengan benar).
Perlu menangani semua kasus ini:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Ini semua harus berakhir di https://example.com/path (# 4) tanpa perulangan. Ada ide?
Jawaban:
Cara terbaik untuk melakukannya adalah dengan menggunakan tiga blok server: satu untuk mengarahkan ulang http ke https, satu untuk mengarahkan ulang https www-name ke no-www, dan satu lagi untuk benar-benar menangani permintaan. Alasan untuk menggunakan blok server tambahan alih-alih seandainya pemilihan server dilakukan menggunakan tabel hash, dan sangat cepat. Menggunakan tingkat server jika berarti jika dijalankan untuk setiap permintaan, yang sia-sia. Juga, menangkap uri yang diminta dalam penulisan ulang itu sia-sia, karena nginx sudah memiliki informasi ini dalam variabel $ uri dan $ request_uri (tanpa dan dengan string kueri, masing-masing).
sumber
https://example.com/
www.sub.example.com
kesub.example.com
dan kemudian hanya mendapatkan sertifikat SSL untuksub.example.com
Sekarang saya tahu bahwa ssl cert memeriksa terjadi sebelum redirect 301, jadi tidak bisa bekerja. Penjelasan lebih lanjut di sini: serverfault.com/a/358625/144811Ini bekerja untuk saya:
Perlu diingat bahwa keduanya
yourdomain.com
danwww.yourdomain.com
harus dalam sertifikat SSL Anda. Ini dimungkinkan dengan sertifikat wildcard atau dengan Server Alternate Name seperti yang dijelaskan di sini . Periksa https://www.startssl.com untuk sertifikat yang bagus dan gratis yang melakukan ini. ( Edith : dimulai dengan Chrome versi 56, sertifikat beginsl tidak akan dipercaya lagi. Coba https://letsencrypt.org/ sebagai gantinya.)sumber
include
aturan untuk menambahkannya ke kedua blok server SSL.Setelah menghabiskan begitu banyak waktu dengan ratusan kasus serupa, saya telah membuat potongan berikut. Ini pendek dan dapat dengan mudah diubah agar sesuai dengan apa pun.
Ya bisa . Tapi itu ada karena suatu alasan, dan seharusnya tidak membahayakan mereka yang tahu cara menggunakannya dengan benar. ;)
sumber
Saya lebih suka kembali dengan kode respons sehingga browser tahu Anda mengarahkannya ke URL lain.
kemudian konfigurasi server lain memblokir untuk
https
sumber
bagaimana cara membuat blok server untuk tujuan ini:
kemudian restart nginx
sumber
https://www.example.com
untukhttps://example.com
juga.Saya pikir ini harus berhasil.
Pada definisi server HTTP polos Anda sesuatu seperti anthonysomerset disarankan, yaitu:
Kemudian pada definisi server SSL Anda:
Dengan cara ini pengalihan hanya akan terjadi sekali per permintaan, tidak peduli URL mana yang digunakan pengguna semula.
sumber
if ($host = 'www.example.com') {
Anda karena regex Anda tidak bekerja untuk saya. Tidak tahu mengapa, karena terlihat benar.Inilah contoh lengkap yang akhirnya berhasil untuk saya. Masalahnya adalah bahwa saya tidak memiliki rincian ssl (
ssl_certificate
, dll.) Di blok redirect www. Ingatlah untuk memeriksa log Anda (sudo tail -f /var/log/nginx/error.log
)!sumber