Introduction
Un serveur web Apache utilise un fichier .htaccess pour la configuration spécifique au site. Un fichier htaccess préconfiguré (htaccess.txt) est fourni avec Joomla. Il se trouve dans le répertoire racine de Joomla et contient des instructions permettant d'éviter les exploits courants des pirates et de mettre en œuvre les URL SEF. Si Joomla est installé dans un sous-répertoire, il se peut qu'il y ait un fichier .htaccess supplémentaire dans le répertoire parent. Apache traite chacun d'entre eux à son tour.
La pratique normale consiste à renommer le fichier htaccess.txt fourni par Joomla en .htaccess, en association avec la sélection des paramètres SEO dans le panneau de Configuration générale. Votre service d'hébergement peut ajouter d'autres paramètres au fichier .htaccess, il peut donc être préférable de fusionner votre fichier .htaccess avec tout fichier .htaccess existant fourni par le système.
Configuration de la plateforme
Le fichier actif est défini dans l'un des fichiers httpd.conf avec :
AccessFileName .htaccess
Il est par défaut .htaccess (ce qui le rend caché sur les systèmes de fichiers de type Unix). Il n'est pas nécessaire de modifier cela.
Sur la plateforme Windows, vous pourriez le changer en :
AccessFileName htaccess.ini
afin de pouvoir l'éditer plus facilement.
Ne modifiez pas le fichier htaccess.txt car il pourrait être écrasé par une mise à jour de Joomla et toute modification serait alors perdue.
Mises à jour de Joomla
Le fichier htaccess.txt peut changer d'une version de Joomla à l'autre. En cas de doute, ou si des problèmes étranges surviennent après une mise à jour, assurez-vous que votre fichier .htaccess est à jour. Voici le contenu du fichier htaccess.txt inclus avec Joomla 5.1 :
##
# @package Joomla
# @copyright (C) 2005 Open Source Matters, Inc. <https://www.joomla.org>
# @license GNU General Public License version 2 or later; see LICENSE.txt
##
##
# READ THIS COMPLETELY IF YOU CHOOSE TO USE THIS FILE!
#
# The line 'Options +FollowSymLinks' may cause problems with some server configurations.
# It is required for the use of Apache mod_rewrite, but it may have already been set by
# your server administrator in a way that disallows changing it in this .htaccess file.
# If using it causes your site to produce an error, comment it out (add # to the
# beginning of the line), reload your site in your browser and test your sef urls. If
# they work, then it has been set by your server administrator and you do not need to
# set it here.
##
## MISSING CSS OR JAVASCRIPT ERRORS
#
# If your site looks strange after enabling this file, then your server is probably already
# gzipping css and js files and you should comment out the GZIP section of this file.
##
## OPENLITESPEED
#
# If you are using an OpenLiteSpeed web server then any changes made to this file will
# not take effect until you have restarted the web server.
##
## Can be commented out if causes errors, see notes above.
Options +FollowSymlinks
Options -Indexes
## No directory listings
<IfModule mod_autoindex.c>
IndexIgnore *
</IfModule>
## Suppress mime type detection in browsers for unknown types
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
## Protect against certain cross-origin requests. Plus d'informations ici :
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP)
## https://web.dev/why-coop-coep/
#<IfModule mod_headers.c>
# Header always set Cross-Origin-Resource-Policy "same-origin"
# Header always set Cross-Origin-Embedder-Policy "require-corp"
#</IfModule>
## Désactive le JavaScript en ligne lors de l'ouverture directe de fichiers SVG ou de leur intégration avec la balise object
<FilesMatch "\.svg$">
<IfModule mod_headers.c>
Header always set Content-Security-Policy "script-src 'none'"
</IfModule>
</FilesMatch>
## Ces directives ne sont activées que si le module Apache mod_rewrite est activé
<IfModule mod_rewrite.c>
RewriteEngine On
## Début - Règles de réécriture pour bloquer certains exploits courants.
# Si vous rencontrez des problèmes sur votre site, commentez les opérations listées
# ci-dessous en ajoutant un # au début de la ligne.
# Ceci tente de bloquer les types de tentatives d'exploitation les plus courants sur Joomla!
#
# Bloque tout script tentant d'encoder en base64 des données dans l'URL.
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
# Bloque tout script incluant une balise <script> dans l'URL.
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
# Bloque tout script tentant de définir une variable PHP GLOBALS via l'URL.
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
# Bloque tout script tentant de modifier une variable _REQUEST via l'URL.
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
# Retourne un en-tête 403 Forbidden et affiche le contenu de la page d'accueil racine
RewriteRule .* index.php [F]
#
## Fin - Règles de réécriture pour bloquer certains exploits courants.
## Début - Redirections personnalisées
#
# Si vous devez rediriger certaines pages, ou définir une redirection canonique
# non-www vers www (ou l'inverse), placez ce code ici. Assurez-vous que ces
# redirections utilisent la bonne syntaxe RewriteRule et les drapeaux [R=301,L].
#
## Fin - Redirections personnalisées
##
# Décommentez la ligne suivante si l'URL de votre serveur web
# n'est pas directement liée aux chemins de fichiers physiques.
# Mettez à jour votre répertoire Joomla! (juste / pour la racine).
##
# RewriteBase /
## Début - Section SEF du noyau Joomla!.
#
# Correctif PHP FastCGI pour HTTP Authorization, requis pour l'application API
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# -- URL SEF pour l'application API
# Si le chemin demandé commence par /api, que le fichier n'est pas /api/index.php
# et que la requête n'a pas déjà été réécrite en interne vers le
# script api/index.php
RewriteCond %{REQUEST_URI} ^/api/
RewriteCond %{REQUEST_URI} !^/api/index\.php
# et que le chemin et le fichier demandés ne correspondent pas directement à un fichier physique
RewriteCond %{REQUEST_FILENAME} !-f
# et que le chemin et le fichier demandés ne correspondent pas directement à un dossier physique
RewriteCond %{REQUEST_FILENAME} !-d
# réécrit en interne la requête vers le script /api/index.php
RewriteRule .* api/index.php [L]
# -- URL SEF pour l'application frontale publique
# Si le chemin et le fichier demandés ne sont pas /index.php et que la requête
# n'a pas déjà été réécrite en interne vers le script index.php
RewriteCond %{REQUEST_URI} !^/index\.php
# et que le chemin et le fichier demandés ne correspondent pas directement à un fichier physique
RewriteCond %{REQUEST_FILENAME} !-f
# et que le chemin et le fichier demandés ne correspondent pas directement à un dossier physique
RewriteCond %{REQUEST_FILENAME} !-d
# réécrit en interne la requête vers le script index.php
RewriteRule .* index.php [L]
#
## Fin - Joomla! core SEF Section.
</IfModule>
## These directives are only enabled if the Apache mod_rewrite module is disabled
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When Apache mod_rewrite is not available, we instruct a temporary redirect
# of the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 302 ^/$ /index.php/
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
## GZIP & BROTLI
## These directives are only enabled if the Apache mod_headers module is enabled.
## This section will check if a .gz file exists and if so will stream it
## directly or fallback to gzip any asset on the fly
## If your site starts to look strange after enabling this file, and you see
## ERR_CONTENT_DECODING_FAILED in your browser console network tab,
## then your server is already gzipping css and js files and you don't need this
## block enabled in your .htaccess
<IfModule mod_headers.c>
# Serve gzip compressed CSS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]
# Serve gzip compressed JS files if they exist
# and the client accepts gzip.
RewriteCond "%{HTTP:Accept-encoding}" "gzip"
RewriteCond "%{REQUEST_FILENAME}\.gz" -s
RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]
# Serve correct content types, and prevent mod_deflate double compression.
RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1,E=no-brotli:1]
RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1,E=no-brotli:1]
<FilesMatch "(\.js\.gz|\.css\.gz)$">
# Serve correct encoding type.
Header set Content-Encoding gzip
# Force proxies to cache gzipped &
# non-gzipped css/js files separately.
Header append Vary Accept-Encoding
</FilesMatch>
</IfModule>