Rediriger le trafic vers le port 443 sous Apache


Alias n'est pas qu'une commande Unix

Continuons dans la série documentons un peu la configuration du serveur sur le blog. Voyons désormais comment rediriger simplement le trafic de http à https dans Apache.

Traditionnellement, les tutoriaux glanés sur le Web conseillent d'utiliser le mod_rewrite, or celui-ci est complexe, pas super intuitif et sa syntaxe n'est pas très lisible :

<VirtualHost *:80>
			...
			RewriteEngine on
			ReWriteCond %{SERVER_PORT} !^443$
			RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=308,L]

Petite aparté avant d'aller plus loin, les redirections permanentes sont désormais à gérer via un code de réponse 308 définit dans le RFC 7538 (en résumé : c'est presque la même chose que le code 301, à la différence qu'il est maintenant impossible de changer de méthode HTTP, un POST en GET par exemple. Par ailleurs, ce code n'est pas encore implémenté dans Internet Explorer – à voir si Edge le connaît – ce qui permet de troller un peu les utilisateurs de cette chose 😊). Bref, 3 directives pour une bête redirection... Le mod_alias permet de faire la même chose en une seule directive parfaitement claire et lisible.

Il faut d'abord s'assurer que le module est bien chargé :

		# a2enmod alias
		Module alias already enabled

mod_alias est normalement chargé par défaut avec la configuration de base d'Apache, dans tous les cas, ça ne coûte pas grand chose de vérifier. Une fois le module actif, on modifie le fichier de configuration pour remplacer les directives du mod_rewrite par :

<VirtualHost *:80>
			...
			Redirect 308 "/" "https://www.shaftinc.fr/"

On relance le serveur, et c'est tout. Toutes les requêtes vers le port 80 seront correctement redigées vers le port 443. On s'assure que le serveur a bien le comportement souhaité :

		# curl -i http://www.shaftinc.fr/url-bidon
		HTTP/1.1 308 Permanent Redirect
		Date: Fri, 29 Dec 2017 01:08:58 GMT
		Server: Apache
		Location: https://www.shaftinc.fr/url-bidon
		Content-Length: 239
		Content-Type: text/html; charset=iso-8859-1

		<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
		<html><head>
		<title>308 Permanent Redirect</title>
		</head><body>
		<h1>Permanent Redirect</h1>
		<p>The document has moved <a href="https://www.shaftinc.fr/url-bidon">here</a>.</p>
		</body></html>

Parfait ! Un navigateur moderne suivra automatiquement la ressource indiquée dans l'entête Location. Les autres verront la page HTML générée par le serveur. Si vous souhaitez utiliser le code de réponse 301 au lieu de 308, le mod_alias possède une directive spécifique : il suffit dans ce cas de remplacer Redirect 308 par RedirectPermanent.

Bonus : le mod_alias peut également être utilisé pour troller un peu sans efforts. Sur ce serveur Web, les requêtes GET /wp-login.php (page de login par défaut des sites sous WordPress) que spamment des bots sont ainsi redirigées :

<Directory /var/www/>
		...
		RedirectPermanent "/wp-login.php" "https://www.google.com/?q=wordpress+for+dummies"

Il est possible de remplacer Google par un autre moteur (fonctionne avec Bing, Duckduckgo et Qwant, il suffit de changer l'autorité – RFC 3986 section 3.2 – de l'URL).