Gestion de fichier .htaccess

Un fichier .htaccess sert à la configuration de serveur Apache. Il est situé dans les dossiers du site web et la portée de la configuration est limitée au contenu du répertoire où il est situé. Il est donc possible d'avoir des configurations différentes selon le chemin désirer.


Filtrage d'adresse IP

Les fichiers .htaccess permettent le filtrage d'adresses IP.

Pour bloquer une adresse IP il faut rajouter au .htaccess :

Deny from X.X.X.X

Vous pouvez aussi bloquer plusieurs adresses IP :

Deny from all

La gestion des pages d'erreurs

Apache fournit une page générique affichant une erreur lorsqu'une ressource ne peut être accédée directement. Il est possible de créer une page d'erreur personnalisée et de la mentionner dans le fichier .htaccess de la manière qui suit :

ErrorDocument 404 /404.html
ErrorDocument 500 /500.html

Redirection de pages

Il est possible de créer des redirections temporaire (302) ou permanente (301) en utilisant la méthode suivante :

Redirect 301 /old-page.html https://www.webo3.com/new-page.html
Redirect 302 / https://www.webo3.com/maintenance.html

Réécriture d'URL

Les fichiers .htaccess permettent également de réécrire les URL afin de les simplifier. Par exemple, une URL du type :

https://www.webo3.com/index.php?page=contact

Peut être transformée en :

https://www.webo3.com/contact

Le .htaccess contiendra :

RewriteEngine on
RewriteRule ^contact$ index.php?page=contact [L]

Pour obtenir plus d'information sur le module "rewrite" d'Apache consultez : https://httpd.apache.org/docs/2.4/fr/mod/mod_rewrite.html.

Configuration suggérée

Afin d'avoir de meilleures performances, il est suggéré d'utiliser les configurations suivantes afin de compresser (gziper) ainsi que d'activer la cache de navigateur. Le fichier .htaccess suivant comprend aussi de l'information pour faire des redirections HTTPS et quelques éléments de sécurité.

# Contrôler les entêtes.
<IfModule mod_headers.c>
    Header set X-UA-Compatible "IE=edge"
    Header set X-Content-Type-Options nosniff
    Header always append X-Frame-Options SAMEORIGIN
</IfModule>

# Permettre l'accès aux fonts.
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

# S'assurer que les extensions de fichier sont du bon type MIME.
<IfModule mod_mime.c>

  # Audio
    AddType audio/mp4                                   m4a f4a f4b
    AddType audio/ogg                                   oga ogg

  # JavaScript
    # Normalize to standard type (it's sniffed in IE anyways):
    # http://tools.ietf.org/html/rfc4329#section-7.2
    AddType application/javascript                      js
    AddType application/json                            json
    AddType text/css                                    css

  # Video
    AddType video/mp4                                   mp4 m4v f4v f4p
    AddType video/ogg                                   ogv
    AddType video/webm                                  webm
    AddType video/x-flv                                 flv

  # Web fonts
    AddType application/font-woff                       woff
    AddType application/vnd.ms-fontobject               eot

    # Browsers usually ignore the font MIME types and sniff the content,
    # however, Chrome shows a warning if other MIME types are used for the
    # following fonts.
    AddType application/x-font-ttf                      ttc ttf
    AddType font/opentype                               otf

    # Make SVGZ fonts work on iPad:
    # https://twitter.com/FontSquirrel/status/14855840545
    AddType     image/svg+xml                           svg svgz
    AddEncoding gzip                                    svgz

  # Other
    AddType application/octet-stream                    safariextz
    AddType application/x-chrome-extension              crx
    AddType application/x-opera-extension               oex
    AddType application/x-shockwave-flash               swf
    AddType application/x-web-app-manifest+json         webapp
    AddType application/x-xpinstall                     xpi
    AddType application/xml                             atom rdf rss xml
    AddType image/webp                                  webp
    AddType image/x-icon                                ico
    AddType text/cache-manifest                         appcache manifest
    AddType text/vtt                                    vtt
    AddType text/x-component                            htc
    AddType text/x-vcard                                vcf

</IfModule>

# Activer la compression.
<IfModule mod_deflate.c>

    # Forcer la compression.
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>

    # Compresser les différents MIME-types
    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    </IfModule>

</IfModule>

# Activer la cache
<IfModule mod_expires.c>

    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"

  # Data interchange
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!)
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML components (HTCs)
    ExpiresByType text/x-component                      "access plus 1 month"

  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"

  # Manifest files
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"

  # Web feeds
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

  # Web fonts
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"

</IfModule>

# Enlever l'affichage des fichiers si le dossier est vide.
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

# Réécriture
<IfModule mod_rewrite.c>

    RewriteEngine On

    # ----------------------------------------------------------------------
    # Ajouter "www." au début de l'URL.
    # ----------------------------------------------------------------------
    RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    # ----------------------------------------------------------------------
    # Forcer l'utilisation SSL.
    # ----------------------------------------------------------------------
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

    # ----------------------------------------------------------------------
    # Bloquer l'accès aux fichiers cachés à l'exception du dossier
    # .well-known qui est utilisé pour générer des certificats SSL.
    # ----------------------------------------------------------------------
    RewriteRule "(^|/)\.well-known" - [S=1]
    RewriteRule "(^|/)\." - [F]

    # ----------------------------------------------------------------------
    # Redirection des barres obliques s'il ne s'agit pas d'un dossier.
    # ----------------------------------------------------------------------
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # ----------------------------------------------------------------------
    # Redirection vers un contrôleur de script (index.php).
    # ----------------------------------------------------------------------
    # RewriteCond %{REQUEST_FILENAME} !-d
    # RewriteCond %{REQUEST_FILENAME} !-f
    # RewriteRule ^ index.php [L]

    # ----------------------------------------------------------------------
    # Ajout des informations d'authorisation pour être lisible par un script.
    # ----------------------------------------------------------------------
    # RewriteCond %{HTTP:Authorization} .
    # RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>