J'utilise nginx sur le cloud Rackspace suite à un tutoriel et ayant cherché sur le net et jusqu'à présent, je ne peux pas trier cela.
Je veux que www.mysite.com se rende sur mysite.com comme d'habitude dans .htaccess pour le référencement et pour d'autres raisons.
Ma configuration /etc/nginx/sites-available/www.example.com.vhost :
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
J'ai aussi essayé
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
J'ai aussi essayé. Les deux tentatives donnent des erreurs de boucle de redirection.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
Mon DNS est configuré en standard:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(des exemples d'adresses IP et de dossiers ont été utilisés pour des exemples et pour aider les gens à l'avenir). J'utilise Ubuntu 11.
Dashboard > Settings > General Settings
et assurez-vous qu'il n'y en a paswww
dans les URL d'adresse WordPress / adresse du site. Peu importe comment vous configurez votre nginx, si vous avez un www dans ces URL, il sera redirigé vers celui avec www dedans.Réponses:
Solution HTTP
D'après la documentation , "la bonne façon est de définir un serveur séparé pour example.org":
Solution HTTPS
Pour ceux qui veulent une solution comprenant
https://
...Remarque: Je n'ai pas initialement inclus
https://
dans ma solution car nous utilisons des équilibreurs de charge et notre serveur https: // est un serveur de paiement SSL à fort trafic: nous ne mélangeons pas https: // et http: //.Pour vérifier la version de nginx, utilisez
nginx -v
.Supprimer www de l'url avec la redirection nginx
Vous devez donc avoir DEUX codes de serveur.
Ajoutez le www à l'url avec la redirection nginx
Si ce dont vous avez besoin est le contraire, pour rediriger de domain.com vers www.domain.com, vous pouvez utiliser ceci:
Comme vous pouvez l'imaginer, c'est tout le contraire et fonctionne de la même manière que le premier exemple. De cette façon, vous n'obtiendrez pas de marques SEO, car il s'agit d'une redirection et d'un déplacement permanents. Le no WWW est forcé et le répertoire affiché!
Une partie de mon code ci-dessous pour une meilleure vue:
la source
return 301 $scheme://domain.com$request_uri;
. Il n'est pas nécessaire de capturer de motifs, voir les pièges de NginxEn fait, vous n'avez même pas besoin d'une réécriture.
Comme ma réponse obtient de plus en plus de votes, mais aussi ce qui précède. Vous ne devez jamais utiliser un
rewrite
dans ce contexte. Pourquoi? Parce que nginx doit traiter et démarrer une recherche. Si vous utilisezreturn
(qui devrait être disponible dans n'importe quelle version de nginx), il arrête directement l'exécution. Ceci est préférable dans n'importe quel contexte.Redirigez les deux, non SSL et SSL vers leur homologue non www:
La
$scheme
variable ne contiendra quehttp
si votre serveur n'écoute que sur le port 80 (par défaut) et que l'option listen ne contient pas lessl
mot - clé. Ne pas utiliser la variable ne vous fera gagner aucune performance.Notez que vous avez besoin d'encore plus de blocs serveur si vous utilisez HSTS, car les en-têtes HSTS ne doivent pas être envoyés via des connexions non chiffrées. Par conséquent, vous avez besoin de blocs de serveur non chiffrés avec des redirections et de blocs de serveur chiffrés avec des redirections et des en-têtes HSTS.
Redirigez tout vers SSL (configuration personnelle sous UNIX avec IPv4, IPv6, SPDY, ...):
Je suppose que vous pouvez imaginer d'autres composés avec ce modèle maintenant par vous-même.
Plus de mes configs? Allez ici et ici .
la source
Vous pouvez découvrir que vous souhaitez utiliser la même configuration pour plus de domaines.
L'extrait suivant supprime www avant tout domaine:
la source
http
pour$scheme
return ...
etrewrite ... last
". Des liens mis à jour vers des problèmes de performances?Vous avez besoin de deux blocs serveur.
Mettez-les dans votre fichier de configuration, par exemple
/etc/nginx/sites-available/sitename
Supposons que vous décidiez d'utiliser http://example.com comme adresse principale à utiliser.
Votre fichier de configuration devrait ressembler à ceci:
Le premier bloc serveur contiendra les instructions pour rediriger toutes les demandes avec le préfixe «www». Il écoute les demandes d'URL avec le préfixe «www» et les redirections.
Cela ne fait rien d'autre.
Le deuxième bloc serveur contiendra votre adresse principale - l'URL que vous souhaitez utiliser. Tous les autres réglages sont ici comme
root
,index
,location
, etc. Vérifiez le fichier par défaut de ces paramètres , vous pouvez inclure dans le bloc de serveur.Le serveur a besoin de deux enregistrements DNS A.
Pour ipv6, créez la paire d'enregistrements AAAA en utilisant votre adresse ipv6.
la source
Voici comment le faire pour plusieurs noms de serveur www vers no-www (je l'ai utilisé pour les sous-domaines):
la source
Meilleure pratique: séparé
server
avec codage en durserver_name
La meilleure pratique avec nginx est d'utiliser un séparé
server
pour une redirection comme celle-ci (non partagée avec laserver
configuration principale), de tout coder en dur et de ne pas utiliser du tout d'expressions régulières.Il peut également être nécessaire de coder en dur les domaines si vous utilisez HTTPS, car vous devez savoir à l'avance quels certificats vous fournirez.
Utilisation d'expressions régulières dans
server_name
Si vous avez un certain nombre de sites et que vous ne vous souciez pas des performances les plus élevées, mais que chacun d'entre eux ait la même politique en ce qui concerne le
www.
préfixe, vous pouvez utiliser des expressions régulières. La meilleure pratique d'utiliser un élément distinctserver
serait toujours valable.Notez que cette solution devient délicate si vous utilisez https, car vous devez alors avoir un seul certificat pour couvrir tous vos noms de domaine si vous voulez que cela fonctionne correctement.
non
www
àwww
w / regex dans un single dédiéserver
pour tous les sites:www
à non-www
w / regex dans un single dédiéserver
pour tous les sites:www
à non-www
w / regex dans un site dédiéserver
à certains sites uniquement:Il peut être nécessaire de limiter l'expression rationnelle pour couvrir seulement quelques domaines, vous pouvez alors utiliser quelque chose comme ça pour correspondre uniquement
www.example.org
,www.example.com
etwww.subdomain.example.net
:Test d'expressions régulières avec nginx
Vous pouvez tester que l' expression régulière fonctionne comme prévu avec
pcretest
sur votre système, qui est exactement la mêmepcre
bibliothèque que votre nginx utilisera pour les expressions régulières:Notez que vous n'avez pas à vous soucier des points de fin ou de la casse, car nginx s'en occupe déjà, selon le nom du serveur nginx regex lorsque l'en-tête "Host" a un point de fin .
Saupoudrer
if
dans le existantserver
/ HTTPS:Cette solution finale n'est généralement pas considérée comme la meilleure pratique, mais elle fonctionne et fait toujours l'affaire.
En fait, si vous utilisez HTTPS, cette solution finale peut être plus facile à maintenir, car vous n'auriez pas à copier-coller tout un tas de directives ssl entre les différentes
server
définitions, et pourriez à la place placer les extraits uniquement dans les serveurs nécessaires, ce qui facilite le débogage et la maintenance de vos sites.non
www
àwww
:www
à nonwww
:codage en dur d'un seul domaine préféré
Si vous voulez un peu plus de performances, ainsi que la cohérence entre plusieurs domaines qu'un seul
server
peut utiliser, il peut toujours être judicieux de coder en dur explicitement un seul domaine préféré:Références:
la source
Cette solution vient de mon expérience personnelle. Nous avons utilisé plusieurs compartiments Amazon S3 et un serveur pour la redirection
non-www
vers deswww
noms de domaine pour correspondre à la stratégie d'en-tête "Host" S3 .J'ai utilisé la configuration suivante pour le serveur nginx :
Cela correspond à tous les noms de domaine pointés vers le serveur commençant par n'importe quoi mais
www.
et redirige verswww.<domain>
. De la même manière, vous pouvez faire une redirection opposée dewww
versnon-www
.la source
listen 80
vous devez ajouter des directiveslisten 443 ssl
et puisssl_certificate
etssl_certificate_key
.listen 443 ssl
avec certificat manquant. Cela ne fonctionnera pas et cause de sérieux maux de tête.J'ai combiné le meilleur de toutes les réponses simples, sans domaines codés en dur.
301 redirection permanente de non-www vers www (HTTP ou HTTPS):
Si vous préférez non HTTPS, non www vers HTTPS, www redirigez en même temps:
la source
Rediriger non www vers www
Pour un domaine unique:
Pour tous les domaines:
Redirigez www vers non-www pour un seul domaine:
Pour tous les domaines:
la source
80
et443
?listen
directives pour moi (nginx 1.4.6).essaye ça
Autre moyen: Nginx no-www à www
et www à no-www
la source
Format unique:
la source
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
la source
$scheme://www.domain.com$1
pour éviter la double barre obliqueJe ne sais pas si quelqu'un remarque qu'il peut être correct de retourner un 301, mais les navigateurs s'y étouffent en faisant
est plus rapide que:
la source
Blog fantôme
afin de faire la méthode recommandée par nginx avec le
return 301 $scheme://example.com$request_uri;
travail avec Ghost, vous devrez ajouter dans votre bloc serveur principal:la source
Si vous ne voulez pas coder en dur le nom de domaine, vous pouvez utiliser ce bloc de redirection. Le domaine sans le www de tête est enregistré en tant que variable
$domain
qui peut être réutilisée dans l'instruction de redirection.REF: rediriger un sous-domaine avec une expression régulière dans nginx
la source
la source
Si vous rencontrez des difficultés pour que cela fonctionne, vous devrez peut-être ajouter l'adresse IP de votre serveur. Par exemple:
où XXX.XXX.XXX.XXX est l'adresse IP (évidemment).
Remarque: crs SSL et l'emplacement des clés doivent être définis pour rediriger correctement les demandes https
N'oubliez pas de redémarrer nginx après avoir effectué les modifications:
la source
/etc/init.d/nginx reload
vous pouvez aussireload
le serveur qui ne cause aucun temps d'arrêt.