# Apache/URL Rewriting

* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
* Installation d'Apache
* Plusieurs sites par machine
* Serveurs virtuels (vhost)
* Répertoires utilisateurs
* Ré-écriture d'URL
* .htaccess
* Sécurité
* Connexion sécurisée (HTTPS)
* Common Gateway Interface (CGI)
* Cache web
* Problèmes connus
[ Modifier le sommaire ]

## Principe

Sur Internet on distingue globalement quatre types de redirection automatique des navigateurs vers d'autres adresses que celles sur lesquelles ils arrivent :
* HTML (<meta http-equiv="refresh" content="1; URL=http://destination.fr">).
* PHP (header('Location: http://destination.fr');).
* Javascript.
* HTTP, proposant elle-même plusieurs techniques décrites ci-dessous.
Les règles de réécriture appliquées sur tout le serveur Apache se situent dans /etc/apache2/sites-available/default ou /usr/local/apache/conf/httpd.conf.
Les fichiers .htaccess peuvent également en contenir pour personnaliser chaque répertoire.
D'une manière générale, Apache permet de rediriger vers une autre page grâce à :
* Dans les systèmes Unix, la ligne Options +FollowSymLinks permet au navigateur de suivre les liens symboliques, en naviguant dans le système de fichier.
* Alias.
* AliasMatch (pareil avec du regex).
* RewriteRule réécrit l'URL selon des règles pouvant être précisées en regex. Il nécessite d'être installé sous peine d'erreurs 500, via la commande Unix a2enmod rewrite.
* Redirect renvoie simplement ailleurs.
* RedirectMatch (pareil avec du regex).
Définir une redirection définitive (Redirect permanent) ne s'annule pas seulement en changeant le code qui l'a définit, mais dure jusqu'à expiration du cache serveur.
Pour réaliser des tests, on préférera donc définir une redirection 302 à une 301.
Pour forcer la suppression du cache des redirections, lancer htcacheclean. Exemples :
* Sur Debian 6 :
* Sur Ubuntu :
* Sur Gentoo :
Puis relancer Apache.
Quand on redirige en 301 ou 302, on peut conserver les paramètres GET mais pas les POST. Pour ce faire, il faut rediriger en 307.

### AllowOverride

Attention, si vous n'avez pas créé de VirtualHost, un VirtualHost par défaut est utilisé par apache2 qui ignore les fichiers .htaccess
Pour y remédier :
et remplacez AllowOverride none par AllowOverride All (normalement 2 fois), puis relancez apache :

## Exemples

Dans la syntaxe suivante, le point seul représente le répertoire courant, et le slash seul la racine de l'URL (le domaine).
Pour changer le domaine vers localhost, tout en gardant la même URL :
Plus subtile, on peut changer l'ordre des paramètres initiaux dans l'URL de destination :
Plusieurs flags peuvent être placés en fin de ligne pour préciser la règle :
* [R] : (redirect) type de redirection (ex : R=301).
* [L] : (last) stoppe les règles de réécritures après la courante.
* [QSA] : (qsappend) conserve les paramètres GET en cas de redirection.
* [NC] : (no case) insensibilité à la casse.
Pour rediriger les requêtes sous certaines condition il existe RewriteCond. Par exemple pour que toutes les pages non trouvées renvoient vers l'accueil au lieu d'afficher une erreur :
Dans la RewriteRule, $1 correspond au premier groupe de capture de la règle, et %1 à celui de la dernière condition.
Les paramètres du RewriteCond peuvent être :
| Variable | Définition | Exemple de valeur (sur https://fr.wikibooks.org/wiki/Apache?debug=true) |
| REQUEST_SCHEME | Protocole de l'URL | https |
| HTTP_HOST | Adresse du site | fr.wikibooks.org |
| SERVER_PORT | Port logiciel | 443 |
| REQUEST_URI | Uniform Resource Identifier | /wiki/Apache |
| QUERY_STRING | Paramètres HTTP | debug=true |
| THE_REQUEST | REQUEST_URI + QUERY_STRING + REQUEST_SCHEME | GET /wiki/Apache?debug=true HTTP/1.1 |
| REQUEST_FILENAME | Chemin ciblé par l'URL dans le système de fichier | /var/www/wiki/index.php |
etc.

### Retirer les doubles slashs dans les URL

La règle suivante permet de remplacer "//" ou "///" par "/"
Autre solution, qui évite la redirection si les paramètres de l'URL en contiennent une autre (avec "http(s)://") :

## Références

* ↑ https://openclassrooms.com/courses/la-redirection-http
* ↑ http://ntt.cc/2008/01/21/5-ways-to-redirect-url-with-javascript.html
* ↑ http://saintcarre.dyndns.org/saintcarre/content/tux/Activer-la-r-criture-dURL-sous-Debian-Squeeze
* ↑ http://craym.eu/tutoriels/referencement/url_rewriting.html
* ↑ http://httpd.apache.org/docs/current/fr/mod/mod_alias.html
* ↑ https://httpd.apache.org/docs/2.4/fr/mod/mod_rewrite.html#rewriterule
* ↑ https://httpd.apache.org/docs/2.4/fr/programs/htcacheclean.html
* ↑ http://ka.lpe.sh/2017/05/04/redirect-request-post-data-using-htaccess/
* ↑ http://www.fbollon.net/node/110
* ↑ https://httpd.apache.org/docs/2.4/fr/rewrite/flags.html
* ↑ https://httpd.apache.org/docs/current/fr/mod/mod_rewrite.html
* ↑ https://apache.developpez.com/faq/?page=module_urlrewriting
* ↑ https://stackoverflow.com/questions/36649482/remove-double-slashes-in-url-and-remove-index-php-apache