Httpd redirect reverse-proxy mod-rewrite
Autres actions
Assurez-vous d'avoir correctement configuré votre serveur Apache httpd avant d'aller plus loin !
Réécriture d'URLs (mod_rewrite)
La réécriture d'URLs et très utilisée dans l'élaboration d'APIs ou d'applications où la sémantique des URLs est importante. Le module de réécriture peut, en fonction d'expressions régulières, modifier les URLs envoyées par le navigateur (à la volé) pour limiter l'adhérence avec les fichiers sur le disque dur.
Par exemple, plus besoin d'utiliser /user.php?id=1 pour accéder à l'utilisateur qui possède l'identifiant 1 mais simplement /user/1.
⚠️ Attention toutefois, l'exemple précédent expose votre application aux attaques de type IDOR 😅
Mise en place
La réécriture des URLs se fait sur un répertoire donc:
Si elle est déclarée dans un fichier vhost, il faut qu'elle se trouve entre les balises Directory
<VirtualHost *:80>
<Directory /opt/site>
Require all granted
# On active le module de réécriture
RewriteEngine on
# On test si un fichier existe et on l'affiche
RewriteCond %{REQUEST_FILENAME} !-f
# On test si un répertoire existe et on l'affiche
RewriteCond %{REQUEST_FILENAME} !-d
# Si aucun fichier ou répertoire n'existe on applique la règle de réécriture
# Dans ce cas on prend toute l'URL est on la met dans $_GET['url']
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</Directory>
DocumentRoot /opt/site
ServerName wis.local
</VirtualHost>
Sinon, elle peut se renseigner dans un fichier .htaccess
# On active le module de réécriture
RewriteEngine on
# On test si un fichier existe et on l'affiche
RewriteCond %{REQUEST_FILENAME} !-f
# On test si un répertoire existe et on l'affiche
RewriteCond %{REQUEST_FILENAME} !-d
# Si aucun fichier ou répertoire n'existe on applique la règle de réécriture
# Dans ce cas on prend toute l'URL est on la met dans $_GET['url']
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Il ne reste plus qu'à créer le fichier index.php suivant:
<?php var_dump($_GET['url']);
Pour voir s'afficher l'URL:

Digestion des URLs
Il ne nous reste plus qu'à digérer les URLs pour aiguiller vers la bonne page ! La technique consiste à exploser l'URL pour la lire grâce à un automate à états fini déterministe:
<?php
function digestUrl(){
if(isset($_GET['url']) && !empty($_GET['url'])){
// Si l'URL n'est pas vide, on la met dans un tableau
$url[] = $_GET['url'];
if(strpos($url[0], '/') !== FALSE){
// L'URL possède plusieurs morceaux, découpage dans le tableau
$url = explode('/', $url[0]);
}
// Lecture de la première partie
if($url[0] == 'user'){
// première partie de l'URL 'user'...
...
}else if(...){
// deuxième traitement ici...
}else{
// URL inconnue
http_response_code(404);
echo "File not found";
}
}else{
// L'URL est vide
http_response_code(200);
echo "Page d'index";
}
}
digestUrl();
Les redirections
Les redirections permettent de générer un code http un code http 30X qui aura pour effet de stopper le navigateur est de le rediriger vers une autre URL.
http → https
Par exemple, il peut être utile d'utiliser la directive Redirect pour rediriger quelqu'un qui arrive en http si votre site est en https. Pour cela nous allons créer un Vhost http identique à celui en https et qui aura pour unique rôle d'effectuer une règle de redirection:
<VirtualHost www.tala-informatique.fr:80>
ServerName www.tala-informatique.fr
Redirect "/" "https://www.tala-informatique.fr/"
</VirtualHost>
<VirtualHost www.tala-informatique.fr:443>
ServerName www.tala-informatique.fr
DocumentRoot /var/www/html/
SSLEngine on
SSLCertificateFile /opt/ssl/www.tala-informatique.fr.crt
SSLCertificateKeyFile /opt/ssl/www.tala-informatique.fr.key
</VirtualHost>
Ressource par défaut
Il est également possible de rediriger les âmes égarées qui se retrouvent à la racine de votre serveur Web vers une ressource ou page par défaut.
Dans le fichier ou vous avez déclaré votre Vhost il vous suffit d'ajouter la ligne suivante:
RedirectMatch ^/$ /wiki/
Comme cela, lorsque l'on arrive à la racine / (^/$ → ^ signifie début de ligne et $ fin de ligne) on est redirigé vers /wiki/.
Proxyfication inverse
Il est possible d'utiliser Apache en frontal comme reverse proxy. Cela va rediriger la requête entrante vers un autre serveur web:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://192.168.1.1:8080/
ProxyPassReverse / http://192.168.1.1:8080/
ServerName kfserver.tala-informatique.fr
</VirtualHost>
Dans cet exemple, le serveur Apache va rediriger toutes les requêtes à destination du vhost kfserver.tala-informatique.fr vers le serveur http://192.168.1.1:8080/
On peut aussi ajouter une authentification par mot de passe dans le virtual host :
<VirtualHost *:80>
...
<Proxy *>
AuthUserFile /etc/httpd/conf.d/kfserver.pwd
AuthName "Protected access !"
AuthType Basic
Require valid-user
</Proxy>
</VirtualHost>