Sous-domaine https www à non-www

J’ai un domaine appelé example.com et dans ce domaine il y a deux sous-domaines appelés:

  • qa1.example.com
  • qa2.example.com

Tous sont certifiés SSL. Cependant, j’ai un fichier .htaccess comme suit:

ACTUALISÉ

 Options +FollowSymlinks Options -Indexes  Order deny,allow Deny from all  RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css) RewriteRule ^([^?]*) index.php?route=$1 [L,QSA] RewriteCond %{HTTPS} !=on RewriteRule %{HTTP_HOST} ^www\. RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteBase / RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L] RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L] RewriteRule ^download/(.*) /index.php?route=error/not_found [L] 

Ce qui suit se produit:

  1. http://qa1.example.com > redirige vers> https://qa1.example.com
  2. http://www.qa1.example.com > redirige vers> https://www.qa1.example.com
  3. https://www.qa1.example.com > redirige vers> https://www.qa1.example.com

Le numéro 1 est correct, mais les numéros 2 et 3 doivent être redirigés vers https://qa1.example.com sans le www .

Comment cela peut il etre accompli? Je peux inclure le fichier .htaccess séparément pour les deux sous-domaines.

 RewriteCond %{HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] 

Votre HTTP canonique vers HTTPS et www vers les redirections non-www devrait précéder vos réécritures internes (directives de routage). Après la directive RewriteBase .

Essayez ce qui suit:

 # www to non-www canonicalisation (including subdomains) RewriteRule %{HTTP_HOST} ^www\.(.*) RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L] # HTTP to HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] # Internal rewrites / routing goes here... 

Si vous n’aviez pas de sous-domaines supplémentaires, il serait relativement sortingvial de les combiner en une seule règle. En outre, il devrait s’agir d’une redirection 301 (permanente) plutôt que d’une redirection 302 (temporaire), ce qui correspond à la valeur par défaut de l’indicateur R (Cependant, il peut être plus facile de tester avec des redirections temporaires car elles ne sont pas mises en cache par le navigateur.)

UPDATE: Les directives ci-dessus supposaient que celles-ci allaient dans le fichier Ils devraient toujours fonctionner correctement pour le fichier .htaccess sous-domaines, mais ils pourraient être optimisés en une seule règle (au plus une redirection, au lieu de deux). Par exemple:

 # www to non-www and HTTP to HTTPS canonicalisation RewriteCond %{HTTPS} !=on [OR] RewriteRule %{HTTP_HOST} ^www\. RewriteRule ^ https://qa1.example.com%{REQUEST_URI} [R=301,L] 

Ce qui précède est évidemment le nom d’hôte du sous-domaine. Si vous ne disposez que de deux sous-domaines, cela ne devrait pas poser de problème. C’est certainement plus sûr .

Pour généraliser ce qui précède, vous pouvez utiliser la variable SERVER_NAME . Cependant, vous devez vous assurer que UseCanoncialName On est d’abord défini dans la configuration de votre serveur (la valeur par défaut est Off ), sinon cela contiendra simplement le nom d’hôte de la requête (qui fait partie du problème rencontré dans votre question). La directive ServerName doit également être définie sur le sous-domaine correct. par exemple. ServerName qa1.example.com .

 # www to non-www and HTTP to HTTPS canonicalisation # UseCanonicalName On - must be set in server config RewriteCond %{HTTPS} !=on [OR] RewriteRule %{HTTP_HOST} ^www\. RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]