rediriger les sous-domaines génériques vers https (nginx)


20

J'ai une certification SSL générique et j'essaie de rediriger tout le trafic non SSL vers SSL. Actuellement, j'utilise ce qui suit pour rediriger l'URL non sous-domaine qui fonctionne bien.

server {
listen      80;
server_name mydomain.com;

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

quand je fais la même chose pour * .mydomain.com, il redirige logiquement vers

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

Comment redirigez-vous tous les sous-domaines vers leur équivalent https?


2
Au lieu de $ server_name, pourquoi pas $ host?
cjc

Réponses:


47

C'est tout...

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

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

2
Un peu plus d'explications pourraient en faire une meilleure réponse.
Dave M

3
@ dave-m, qu'il faut expliquer? $hostvariable? $request_uri?
cadmi

Cela ne fonctionne pas, toujours https: //%2A.handy.travel/
Damon Yuan

2

La documentation officielle de NGINX encourage à utiliser la directive return au lieu d'utiliser la directive rewrite pour effectuer la redirection. Il en est ainsi, car la demande en cours de réécriture n'est pas destinée à ce serveur, mais elle est toujours traitée dans ce bloc de serveur. Les redirections sont donc correctement effectuées avec une directive de retour à la place, car tout traitement est arrêté et une réponse est envoyée immédiatement. NGINX décourage la réécriture pour la redirection ici: http://nginx.org/en/docs/http/converting_rewrite_rules.html

La syntaxe de la directive return est: URL du code retour; Comme vous faisiez initialement une réécriture permanente, vous pouvez donc utiliser 301 comme code pour répondre, indiquant qu'il s'agit d'une redirection permanente. Votre adresse https sera transmise dans la section url. Référence: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Donc, votre configuration correcte serait

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

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

Cela vous permettrait probablement de rediriger correctement vers votre domaine ssl, avec un bloc serveur générique. Vous pouvez également essayer le nom de serveur générique souligné '_' ou $ host comme suggéré dans le commentaire ci-dessus. Faites le nous savoir!


Bien que l'utilisation returnsoit généralement meilleure, la configuration suggérée n'est pas correcte car elle utilise toujours $ server_name pour la redirection, qui sera "* .mydomain.com". Le correctif correct a déjà été décrit par @cjc dans le commentaire ci-dessus - $hostdevrait être utilisé à la place de $server_name.
Maxim Dounin

Oui d'accord. Ah, il semble que ma durée d'attention soit un fadin!
Apurva Sukant

Au lieu de la destruction ci-dessus, permettez-moi de vous offrir une astuce avec votre configuration SSL qui devrait améliorer considérablement les performances. Le moyen le plus efficace de configurer SSL si vous utilisez un certificat générique est de configurer `` l'agrafage SSL '' Cela vous permet de configurer SSL une fois sur votre serveur par défaut pour tous les sous-domaines et enregistre une authentification SSL distincte pour chaque sous-domaine. ssl_stapling on; résolveur 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; Refference- calomel.org/nginx.html
Apurva Sukant

2
Devrait êtrereturn 301 https://$host$request_uri;
scarver2

J'écoute les ports 80, 8080 ET 8181 return 301 https://$server_name$request_uri;pour les amener à utiliser https sur le port 443. Le problème est que l'URL redirigée a toujours le numéro de port d'origine. 80 n'est pas un problème, mais 8080 sort commehttps://example.com:8080
A.Grandt

-1

Essayez quelque chose comme ceci:

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

Le hic est de définir un serveur générique et de faire des redirections en fonction de son nom.


Groupe de regex trop permissif.
Kzqai
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.