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.

Vus : 1095
Publié par Mickaël : 9