redirect wildcard subdomain ke https (nginx)

20

Saya sudah mendapatkan sertifikasi wildcard ssl dan saya mencoba mengalihkan semua lalu lintas non-ssl ke ssl. Saat ini saya menggunakan berikut ini untuk pengalihan url non-subdomain yang berfungsi dengan baik.

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

ketika saya melakukan hal yang sama untuk * .mydomain.com secara logis diarahkan ke

https://%2A.mydomain.com/

Bagaimana Anda mengarahkan semua subdomain ke https mereka yang setara?

apa apa
sumber
2
Alih-alih $ server_name, mengapa tidak $ host?
cjc

Jawaban:

47

Itu saja...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
cadmi
sumber
2
Penjelasan yang lebih banyak mungkin membuat ini jawaban yang lebih baik.
Dave M
3
@ dave-m, apa perlu dijelaskan? $hostvariabel? $request_uri?
cadmi
Itu tidak bekerja, masih punya https: //%2A.handy.travel/
Damon Yuan
2

Dokumentasi resmi NGINX menganjurkan untuk menggunakan arahan balik alih-alih menggunakan arahan penulisan ulang untuk memengaruhi pengalihan. Ini demikian, karena permintaan yang ditulis ulang tidak dimaksudkan untuk server itu, tetapi masih diproses di blok server itu. Jadi pengalihan dilakukan dengan benar dengan arahan balik, karena semua pemrosesan dihentikan dan respons dikirim segera. NGINX melarang menulis ulang untuk pengalihan di sini: http://nginx.org/en/docs/http/converting_rewrite_rules.html

Sintaks untuk arahan balik adalah: URL kode balik; Karena Anda awalnya melakukan penulisan ulang permanen, maka Anda dapat menggunakan 301 sebagai kode untuk merespons, menunjukkan bahwa itu adalah pengalihan permanen. Alamat https Anda akan diteruskan di bagian url. Referensi: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Jadi konfigurasi Anda yang benar adalah

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

Ini mungkin akan membiarkan Anda mengarahkan ulang dengan benar ke domain ssl Anda, dengan blok server wildcard. Anda juga dapat mencoba nama server generik garis bawah '_' atau $ host seperti yang disarankan dalam komentar di atas. Beritahu kami!

Apurva Sukant
sumber
Meskipun menggunakan returnumumnya lebih baik, konfigurasi yang disarankan tidak benar karena masih menggunakan $ server_name untuk pengalihan, yang akan menjadi "* .mydomain.com". Perbaikan yang benar sudah diuraikan oleh @cjc dalam komentar di atas - $hostharus digunakan sebagai ganti $server_name.
Maxim Dounin
Ya setuju. Ah sepertinya rentang perhatianku adalah tren!
Apurva Sukant
Sebagai pengganti gangguan di atas, izinkan saya untuk menawarkan tip dengan konfigurasi ssl Anda yang seharusnya secara signifikan meningkatkan kinerja. Cara paling efisien untuk mengatur SSL jika Anda menggunakan sertifikat wildcard adalah dengan mengatur 'ssl stapling' Ini memungkinkan Anda untuk mengatur SSL sekali di server default Anda untuk semua sub domain, dan menyimpan otentikasi ssl terpisah untuk setiap sub domain. ssl_stapling aktif; resolver 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify pada; Refference- calomel.org/nginx.html
Apurva Sukant
2
Seharusnyareturn 301 https://$host$request_uri;
scarver2
Saya mendengarkan port 80, 8080 DAN 8181 return 301 https://$server_name$request_uri;agar mereka menggunakan https di port 443. Masalahnya adalah url yang dialihkan masih memiliki nomor port asli. 80 bukan masalah, tapi 8080 keluar sebagaihttps://example.com:8080
A.Grandt
-1

Coba sesuatu seperti ini:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

Tangkapannya adalah untuk mendefinisikan server wildcard dan melakukan pengalihan berdasarkan namanya.

Andrei Mikhaltsov
sumber
Kelompok regex yang terlalu permisif.
Kzqai