reindirizzare i sottodomini jolly a https (nginx)


20

Ho una certificazione jolly ssl e sto cercando di reindirizzare tutto il traffico non ssl a ssl. Attualmente sto usando il seguente per il reindirizzamento dell'URL non sottodominato che funziona bene.

server {
listen      80;
server_name mydomain.com;

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

quando faccio la stessa cosa per * .mydomain.com, reindirizza logicamente

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

Come reindirizzi tutti i sottodomini al loro equivalente https?


2
Invece di $ nome_server, perché non $ host?
cjc

Risposte:


47

È tutto...

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

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

2
Un po 'più di spiegazione potrebbe rendere questa una risposta migliore.
Dave M,

3
@ dave-m, che ci deve essere spiegato? $hostvariabile? $request_uri?
cadmi,

Non funziona, ho ancora https: //%2A.handy.travel/
Damon Yuan

2

La documentazione ufficiale di NGINX incoraggia a usare la direttiva di ritorno invece di usare la direttiva di riscrittura per effettuare il reindirizzamento. Questo è così, poiché la richiesta da riscrivere non è pensata per quel server, ma viene comunque elaborata in quel blocco di server. Pertanto, i reindirizzamenti vengono eseguiti correttamente con una direttiva di ritorno, poiché tutta l'elaborazione viene interrotta e una risposta viene inviata immediatamente. NGINX scoraggia la riscrittura per il reindirizzamento qui: http://nginx.org/en/docs/http/converting_rewrite_rules.html

La sintassi per la direttiva return è: URL del codice di ritorno; Dato che in origine stavi eseguendo una riscrittura permanente, di conseguenza puoi utilizzare 301 come codice per rispondere, indicando che si tratta di un reindirizzamento permanente. Il tuo indirizzo https verrà passato nella sezione url. Riferimento: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Quindi la tua configurazione corretta sarebbe

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

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

Ciò probabilmente ti consentirebbe di reindirizzare correttamente al tuo dominio SSL, con un blocco server jolly. Puoi anche provare a sottolineare il nome generico del server '_' o $ host come suggerito nel commento sopra. Facci sapere!


Sebbene l'utilizzo returnsia generalmente migliore, la configurazione suggerita non è corretta in quanto utilizza ancora $ nome_server per il reindirizzamento, che sarà "* .miodominio.com". La correzione corretta è già stata delineata da @cjc nel commento sopra - $hostdovrebbe essere usata al posto di $server_name.
Maxim Dounin,

Sì d'accordo. Ah, sembra che le mie capacità di attenzione stiano svanendo!
Apurva Sukant,

Invece della detrazione di cui sopra, permettimi di offrirti un suggerimento con la tua configurazione ssl che dovrebbe migliorare significativamente le prestazioni. Il modo più efficiente per impostare SSL se si utilizza un certificato jolly è impostare 'pinzatura SSL' Ciò consente di impostare SSL una volta sul server predefinito per tutti i sottodomini e salva un'autenticazione SSL separata per ciascun sottodominio. ssl_stapling on; resolver 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Refference- calomel.org/nginx.html
Sukant

2
Dovrebbe esserereturn 301 https://$host$request_uri;
scarver2

Sto ascoltando le porte 80, 8080 E 8181 return 301 https://$server_name$request_uri;per farle usare https sulla porta 443. Il problema è che l'URL reindirizzato ha ancora il numero di porta originale. 80 non è un problema, ma 8080 esce comehttps://example.com:8080
A.Grandt

-1

Prova qualcosa del genere:

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

Il trucco è definire un server jolly e fare reindirizzamenti in base al suo nome.


Gruppo regex eccessivamente permissivo.
Kzqai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.