[Apache] Rediriger uniquement les pages privées de Piwik vers la version HTTPS

Les plus observateurs d’entre vous l’auront remarqué, j’utilise depuis quelques jours un nouveau système d’analyse d’audience : Piwik. Si tout va bien, ce dernier devrait venir remplacer à compter du 1er novembre Google Analytics, qui m’aura rendu cinq années de bons et loyaux services (tout en ayant revendu vos données personnelles, à moins que vous n’utilisiez des outils tel que Disconnect). La bonne nouvelle pour vous, chers visiteurs, c’est que ce changement vous garanti le respect quant à votre choix de ne pas être pisté (souvenez-vous, le fameux « Do Not Track »). Par ailleurs, si votre navigateur ne vous permet pas d’activer cette option, sachez qu’il est également possible de désactiver le suivi via un simple cookie, en cliquant ici.

Bref, c’est bien mieux…  ou presque.

Le problème

Ne souhaitant pas me faire tipiaker mon mot de passe lorsque je consulte mes statistiques sur un réseau wifi public, j’ai décidé de mettre en place une redirection vers la version chiffrée (dite « https ») du sous-domaine dédié à Piwik. Le problème, c’est que mon hébergeur (l’excellent legtux) ne permet pas de renvoyer un certificat SSL différent de celui par défaut, qui se trouve être :

  1. valide uniquement pour legtux.org et ses sous-domaines
  2. signé par la CaCert, une autorité qui n’est malheureusement pas encore reconnue par tous les navigateurs et systèmes exploitations

Bref, rediriger toutes les pages vers la version sécurisée reviendrait à afficher une erreur chez chaque visiteur, lui signalant que la connexion actuelle n’est pas sécurisée. Pas terrible, donc… Mais alors, que faire? Vais-je devoir abandonner cette idée et prendre le risque de faire circuler mon mot de passe de manière non chiffrée? Suis-je condamné à utiliser Google Analytics jusqu’à la fin de mes jours? Que nenni! Une solution miracle existe : rediriger toutes les pages vers la version sécurisée du site, sauf si cette dernière a vocation à être appelée par une personne lambda. Malin!

Et sa solution

Note : la solution proposée ici est destinée au serveur web Apache, avec le module « mod_rewrite ». Si ce dernier n’est pas activé, rapprochez-vous de votre hébergeur.

Note n°2 : vous pouvez retrouver la liste des fichiers devant être accessibles publiquement sur la documentation officielle du projet, section « Use .htaccess to restrict access to a few files only, and restrict by IP address ».

Pour solutionner le problème, rien de plus simple. Connectez-vous en FTP sur l’espace de stockage de votre hébergeur puis, à la racine des fichiers de Piwik (par exemple, dans /www/piwik), créez un nouveau fichier que vous appellerez « **.**htaccess » (n’oubliez pas le point au début). À l’intérieur de ce dernier, placez-y le contenu suivant :

# Si l'URL rewriting est disponible
<IfModule mod_rewrite.c>
    # Alors on l'active
    RewriteEngine On

    RewriteBase /

    # Si nous ne sommes pas déjà en HTTPS
    RewriteCond %{HTTPS} off

    # Et que le fichier appelé n'est pas piwik.php
    RewriteCond %{REQUEST_URI} !^/piwik.php

    # Ni piwik.js
    RewriteCond %{REQUEST_URI} !^/piwik.js

    # Ni robots.txt (si vous en avez un)
    RewriteCond %{REQUEST_URI} !^/robots.txt

    # Et que ce n'est pas la page permettant aux utilisateurs de désactiver Piwik
    RewriteCond %{QUERY_STRING} !^module=CoreAdminHome&action=optOut

    # Fix pour l'erreur « curl_exec: SSL certificate problem: unable to get local issuer certificate. ». À commenter si votre certificat est valide.
    RewriteCond %{REQUEST_URI} !^/misc/cron/archive.php
    RewriteCond %{QUERY_STRING} !^module=API

    # Alors on redirige de manière permanente (= 301) vers la version HTTPS
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Une fois ceci fait, il ne reste plus qu’à tester la solution, en essayant de charger :

Si tout s’est bien passé, la première page est passée automatiquement en https, alors que les deux suivantes sont restées en http.

Et voilà, enjoy!