Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

Httpd redirect reverse-proxy mod-rewrite

De The Linux Craftsman

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>