1 votes

Apache réécrit tout sous-domaine sauf un en https non-www

Je cherche à réduire la chaîne de redirections 301 sur mon serveur donc je voudrais combiner une redirection de sous-domaine vers non-www (sauf lorsque le sous-domaine est dev) avec une redirection de HTTP vers HTTPS (en utilisant %{HTTP:X-Forwarded-Proto}) puisque l'instance est derrière un répartiteur de charge.

Voici ce que j'ai jusqu'à présent dans mon .htaccess:

# Déplacer de http vers https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]

# Supprimer le www en tête
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]

Il y a trois problèmes avec mon implémentation actuelle:

  1. Une requête à http://www.example.net aura deux redirections.

  2. Comme la plupart des exemples de redirection de www vers non-www sur ce site, cela ne redirigera pas ww. ou wwww. donc mes analyses contiennent beaucoup de sous-domaines mal orthographiés qui n'ont pas été redirigés.

  3. Je voudrais exclure le sous-domaine dev. de la redirection, donc http://dev.example.net et son homologue en https, car j'utilise dev. pour le développement et la mise en staging.

Comment devrais-je combiner cela ?

2voto

Jin-oh Kang Points 121
# Supprime le préfixe www, toujours en utilisant https quel que soit le schéma d'URL actuel
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]

# redirige http vers https, sauf pour dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  1. Ajout du drapeau NC (nocase) à la condition X-Forwarded-Proto, car sa valeur semblait être insensible à la casse, c'est-à-dire HTTP = Http = hTTp = http. Vous pouvez le supprimer librement.
  2. Ajout du drapeau NV (novary) à la condition X-Forwarded-Proto pour le cacher de l'en-tête de réponse Vary. Encore une fois, vous êtes libre de le supprimer, surtout s'il n'est pas nécessaire (le proxy inverse le filtre automatiquement avant de l'envoyer au client) ou nécessaire pour un comportement de mise en cache correct (le cache ne différencie pas autrement le contenu http et https).
  3. Ajout du drapeau NV (novary) à la condition d'en-tête Host pour le cacher de l'en-tête de réponse Vary. Vous pouvez également le supprimer si vous avez un serveur de cache défectueux.
  4. Rendu l'ordre des drapeaux RewriteRule consistent (L,R=301 et R=301,L sont essentiellement identiques).
  5. Empêché www.example.net.but.not.actually.yours.com d'être reconnu, mais permet toujours par exemple www.example.net:443.
  6. Utilisez systématiquement %{REQUEST_URI} comme substitution.
  7. Reconnaît également ww et wwww.

1voto

MrWhite Points 11269

1) Une demande à http://www.example.net fera deux redirections.

Cela peut être résolu en inversant simplement les deux règles. Ensuite, www.example.net est redirigé vers HTTPS dans la première redirection, donc la redirection de HTTP vers HTTPS n'a pas besoin d'être déclenchée.

(Cela suppose cependant que vous n'avez pas l'intention de mettre en œuvre HSTS - auquel cas vous devriez les garder comme deux redirections puisqu'une redirection vers HTTPS sur le même nom d'hôte en premier est une exigence.)

2) Comme la plupart des exemples de redirection de www vers non-www sur ce site, cela ne redirigera pas ww. ou wwww. donc mes analyses contiennent beaucoup de sous-domaines mal orthographiés qui n'ont pas été redirigés.

En règle générale, les demandes vers les sous-domaines ww. ou wwww. ne se résoudront tout simplement pas, donc ce n'est généralement pas un problème. Pour que cela fonctionne, vous devez avoir configuré un sous-domaine générique dans DNS et configuré le serveur pour accepter de telles demandes.

Mais cela peut être pris en compte en modifiant l'expression régulière (extrait) de ^www\. à ^w{2,4}\..

3) Je voudrais exclure le sous-domaine dev. de la redirection, donc http://dev.example.net et son homologue https, car j'utilise dev. pour le développement et la mise en production.

Cela s'applique uniquement à la règle de HTTP vers HTTPS, donc une condition supplémentaire peut être appliquée ici pour exclure les noms d'hôtes qui commencent par dev..

En regroupant les points ci-dessus, essayez ce qui suit :

# Supprimer les préfixes ww, www ou wwww (et rediriger vers HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]

# Passer de http à https (sauf le sous-domaine dev)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]

J'ai gardé votre utilisation de HTTP:Host identique (pour accéder à l'en-tête de requête HTTP Host) au cas où c'est une exigence du répartiteur de charge ? Sinon, il est plus courant d'utiliser la variable de serveur HTTP_HOST ici.

Le préfixe ! sur le CondPattern (c'est-à-dire !^dev\.) négative l'expression régulière, donc la condition est réussie lorsque le Host ne commence pas par dev.. (Je suppose que www.dev. n'est pas une chose ?)

(.*) est la même chose que ^(.*)$ puisque l'expression régulière est gourmande par défaut.

Vous devrez vider le cache de votre navigateur avant de tester. Il est conseillé de d'abord tester avec des redirections temporaires 302 pour éviter tout problème de mise en cache.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X