J’ai déjà rencontré ce cas de figure plusieurs fois, et à chaque fois je perds un temps précieux pour retrouver l’astuce : la configuration par défaut d’Apache sur Debian 8 et de WordPress ne permettent pas de faire fonctionner les permaliens.
Les permaliens sous WordPress
Les permaliens sont des liens lisibles par l’être humain et dont l’URL est issue du titre des pages, articles et catégories vers lesquels ils pointent. Ils ont différents avantages en termes d’ergonomie et référencement, et on les active via le menu Réglages > Permaliens.
L’activation des permaliens sur un réglage autre que « par défaut » a pour conséquence de créer la règle suivante dans .htaccess.
1 2 3 4 5 6 7 8 9 10 11 |
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress |
Cette règle permet de rediriger tout le contenu vers index.php qui déchiffrera quelle page doit être associée à quelle URL, sauf les fichiers et répertoires existants qui restent accessibles à leur URL naturelle.
Configuration sur Apache
Là où le bat blesse, c’est que la directive RewriteEngine n’est pas toujours autorisée dans le fichier de configuration d’Apache.
En effet, dans le fichier /etc/apache2/apache2.conf on trouve :
1 2 3 4 5 6 |
<Directory /var/www/> Options Indexes FollowSymLinks # AllowOverride None # AllowOverride All Require all granted </Directory> |
La ligne AllowOverride None est ici commentée, et sa valeur est probablement « None » par défaut. Cela signifie qu’un fichier .htaccess n’a pas le droit de modifier certains réglages apache.
On peut s’en sortir en modifiant cette ligne qui prend effet sur l’ensemble du serveur web. On peut aussi ajouter une ligne AllowOverride uniquement dans la configuration du site en question dans /etc/apache2/sites-enabled/mon-site . Voici un exemple de configuration minimal.
1 2 3 4 5 6 7 8 9 10 |
<VirtualHost *:80> ServerName mon-site DocumentRoot /var/www/mon-site ErrorLog /var/log/apache2/mon-site.error.log CustomLog /var/log/apache2/mon-site.access.log common <Directory /var/www/mon-site> AllowOverride All </Directory> </VirtualHost> |
Comme alternative possible, et sans autoriser les fichiers .htaccess à outrepasser la configuration par défaut du serveur web, on peut inclure la configuration .htaccess générée par WordPress entre les balises de configuration <Directory>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<VirtualHost *:80> ServerName mon-site DocumentRoot /var/www/mon-site ErrorLog /var/log/apache2/mon-site.error.log CustomLog /var/log/apache2/mon-site.access.log common <Directory /var/www/mon-site> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Directory> </VirtualHost> |