Expressions régulières .htaccess d'Apache

Pour une solution simple, ajoutez ce qui suit à votre fichier .htaccess :

    RewriteEngine On
    RewriteCond %{HTTP_HOST} !^(www\.example\.com)?$ [NC]
    RewriteRule (.*) https://www.example.com/$1 [R=301,L]

Dans ce cas, une URL de la forme https://example.com/index.php?item=1 sera redirigée vers https://www.example.com/index.php?item=1.

Dans l'exemple ci-dessus :

  • RewriteCond définit une condition de test.
  • %{HTTP_HOST} utilise la variable hôte de la requête (example.com).
  • ! signifie NON et ^ signifie DÉBUT - donc, ne commence pas par www.example.com
  • ( et ) capturent ce qui se trouve entre les parenthèses pour une utilisation en référence arrière.
  • \ transforme le caractère suivant d'un caractère de contrôle en un caractère réel
  • . signifie généralement n'importe quel caractère, mais précédé de \ il signifie un point.
  • ? rend la correspondance facultative
  • $ signifie FIN (de la correspondance facultative).
  • [NC] signifie No Case, c'est-à-dire insensible à la casse.
  • RewriteRule est valide si l'URL ne commence pas par www.
  • (.*) est un motif, dans ce cas un caractère unique répété 0 fois ou plus, représentant la partie chemin de l'URL. Elle est capturée en tant que $1.
  • https://www.example.com/ est le remplacement pour la partie hôte de l'URL.
  • $1 est le chemin capturé.
  • [] contient des indicateurs (flags) - des instructions sur ce qu'il faut faire.
  • R=301 est une instruction pour envoyer un en-tête Moved Permanently.
  • L signifie Last in set - une correspondance ayant été trouvée, ignorer toutes les règles suivantes.

Une solution plus complète corrigeant plusieurs autres problèmes de canonicalisation en même temps :

RewriteEngine On
#
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.html?\ HTTP/
RewriteRule ^(([^/]+/)*)index\.html?$ http://www.example.com/$1 [R=301,L]
#
RewriteCond %{THE_REQUEST} !^POST
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/
RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$
RewriteRule ^(([^/]+/)*)index\.php$ http%2://www.example.com/$1 [R=301,L]
#
RewriteCond %{HTTP_HOST} !^(www\.example\.com)?$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

Si vous souhaitez comprendre tout cela, vous pouvez lire ces articles :