RewriteUrl et RewriteCond, brève comparaison entre les méthodes de réécriture d'URL Apache 2 et NGINX
Avec mickael-allain.fr c'est noël avant l'heure (Ouch, ça ferai pas mal en baseline sur le blog :D) !
Dans ce présent billet, je vais vous présenter de façon sommaire les méthodes de réécriture d'URL pour Apache 2 mais également NGINX.
Tu m'racontes quoi là ? Les RewriteURL c'est quoi concrètement ?
La fameuse phrase du "kesketumeracontes ?". En fait, les RewriteURL sont un traitement interne après d'une requête HTTP sur notre service Web.
GET www.monsite.com/toto => SERVICE HTTP traitant le site www.monsite.com => RewriteURL (par exemple, transforme "toto" en "tata" => Le service HTTP rends la page www.monsite.com/tata
Grâce à ce système, on peux aisément rendre des urls de type www.monsupersite.com/article_id=5 en www.monsupersite.com/mon_titre_d_article_beaucoup_plus_mieux_5 l'utilisateur va comprendre directement (via l'adresse) de quoi retourne le site et "accessoirement" les GoogleBot & cie référence mieux le site en question.
Plan d'action de ce billet
Le but de ce post n'est pas aujourd'hui de décrire dans les moindres détails chaque fonction possible avec les RewriteURL, mais plutôt, de vous familiariser avec cette technique avec quelques exemples concret.
Chaque exemple aura les propriétés suivantes :
- Description du contexte.
- Solution via Apache 2.
- Solution via NGINX.
Pour toutes vos expressions régulières, je vous invite à consulter les éditeurs Rubular et MyRegExp afin de les tester directement. Concernant les explications en détails des réécritures d'URL je vous invite à consulter la documentation d'Apache 2 URL Rewriting mod_rewrite
Redirection de domaine vers son homologue en WWW
Contexte
Imaginons, on vient d'acheter monsuperdomaine.com chez Gandi (Bon d'accord, OVH si vous voulez) et on a fait pointer nos DNS sur notre serveur (Je vous invite à lire mon billet à ce sujet Redirection DNS)
Donc là, on fait le fameux test du ping.
monsuperdomaine.com pointe bien vers 10.10.10.10 www.monsuperdomaine.com pointe bien vers 10.10.10.10
On héberge un blog sur le serveur, et il réponds aux 2 requêtes http://monsuperdomaine.com et http://www.monsuperdomaine.com
Problème, le référencement va considérer les appels avec et sans "www" comme 2 sites différents. Notre devoir est donc de faire pointer le "monsuperdomaine.com" en "www.monsuperdomaine.com"
Solution via Apache 2
Dans notre cas, tout va se passer dans un seul VirtualHost.
# VirtualHost Blog de www.monsuperdomaine.com <VirtualHost *:80> ServerName www.monsuperdomaine.com ServerAlias monsuperdomaine.com RewriteEngine On RewriteCond %{HTTP_HOST} !^www.monsuperdomaine.com$ [NC] RewriteRule ^(.*)$ http://www.monsuperdomaine.com/$1 [R,L] DocumentRoot /var/www/monsupersite/ <Directory /var/www/monsupersite/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
Explications
Notre VirtualHost est configuré pour être pointer soit par le ServerName "www.monsuperdomaine.com" soit par son alias "monsuperdomaine.com". Nous avons ensuite activité le module RewriteEngine en le mettant sur "On".
Dans notre cas, nous voulons appliquer une règle de réécriture (RewriteURL) en accord avec une condition (RewriteCond, mon domaine est monsuperdomaine.com et je veux le réécrire)
La condition RewriteCond %{HTTP_HOST} !^www.monsuperdomaine.com$ [NC] veux dire "Si la variable HTTP_HOST que le client demande n'est pas égale à "www.monsuperdomaine.com" alors tu appliques la règle en dessous. Petit Tips concernant le NC cela corresponds à "No Case", donc, l'adresse n'est pas sensible à la casse.
La règle en dessous est RewriteRule ^(.*)$ http://www.monsuperdomaine.com/$1 [R,L] veux dire "Tu récupères tout ce qu'il y a après le HTTP_HOST (partie droite de l'adresse), et on redirige sur le site "http://www.monsuperdomaine.com/$1" (le $1 étant le rappel de la partie droite de l'URL) Petit Tips concernant R,L, R veux dire "Force Redirect" et L "Last Rule".
Solution via NGINX
NGINX quant à lui est mon gout plus lisible, et ressemble a de la programmation procédurale. Jugez par vous même.
server { listen 80 server_name www.monsuperdomaine monsuperdomaine.com; root /var/www/monsupersite/; # Check the host if ($host != "www.monsuperdomaine.com"){ rewrite ^(.*)$ http://www.monsuperdomaine.com$1 permanent; break; } }
Explications
Dans notre cas d'NGINX, on distingue très nettement la fonction du VirtualHost.
Si la variable $host n'est pas égale à "www.monsuperdomaine.com" alors, on réécrit l'adresse et on "break", sous entendu on force la redirection.
Redirection de la racine de notre racine de notre site vers un répertoire en v2.
Contexte
Vous venez de coder une super application web et vous voulez descendre dans l'arborescence de votre site pour montrer sa version 2 à vos visiteurs.
http://www.monsuperdomaine.com/v2/ quand on appelle www.monsuperdomaine.com
Solution via Apache 2
# VirtualHost Blog de www.monsuperdomaine.com <VirtualHost *:80> ServerName www.monsuperdomaine.com ServerAlias monsuperdomaine.com RewriteEngine On RewriteCond %{REQUEST_URI} !^/v2/ RewriteRule ^(.*)$ /v2/$1 DocumentRoot /var/www/monsupersite/ <Directory /var/www/monsupersite/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
Explications
La variable d'environnement "REQUEST_URI" récupère (et compare) la partie "droite" de notre GET à /v2/, si elle est contenu, on ne redirige pas, dans le cas contraire, on concatène /v2/ et le GET initial.
Solution via NGINX
Le même contexte, mais cette fois-ci en prenant NGINX comme service de page Web.
server { listen 80 server_name www.monsuperdomaine monsuperdomaine.com; root /var/www/monsupersite/; # Check the URI if ($uri !^/v2/){ rewrite ^(.*)$ /v2/$1 permanent; } }
En espérant que ce petit tutorial vous aidera dans votre configuration.
Bonne fêtes à tous.
Mickaël ALLAIN.