htaccess/Translations/French
Shikiryu f4319d76b7 French translation added 2015-02-22 22:45:11 +01:00
..
README.md French translation added 2015-02-22 22:45:11 +01:00

README.md

.htaccess Snippets

Un ensemble de snippets de .htaccess utiles, en un endroit. J'ai décidé de créer ce repo après en avoir eu assez de Googler à chaque fois que je voulais forcer www pour mon nouveau site web.

Disclaimer: Bien que mettre le snippet dans un fichier .htaccess est, la plupart du temps, suffisant, certains cas requièrent des modifications. À utiliser à vos propres risques.

IMPORTANT: Apache 2.4 a introduit plusieurs changemets, principalement dans la configuration des contrôles d'Accès. Pour plus d'information, vérifiez le document de mise à jour ainsi que cet issue.

Crédits

Ce que je fais ici, c'est principalement collecter tous les snippets utiles trouvés partout sur le web (par exemple, un bon morceau provient de Apache Server Configs) . Bien qu'ayant essayé de créditer la bonne personne, des éléments peuvent être manquant. Si vous pensez que quelque chose, ici, provient de votre travail et que vous devriez en être crédité, faites le moi savoir, ou faites une PR.

Sommaire

Réécriture et redirection

Note: Il est requis d'avoir mod_rewrite installé et activé.

Forcer www

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

Forcer www de manière générique

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Cela fonctionne pour tous les domaines. Source

Forcer non-www

C'est toujours en cours de débat selon si www ou non-www est la bonne manière de faire, donc si vous êtes un fan de domaine "à nu", ceci est pour vous :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

Forcer non-www de manière générique

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]

Forcer HTTPS

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Forcer HTTPS Dérrière un Proxy

Utile si vous avez un proxy devant votre serveur faisant du TLS termination.

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Forcer le Slash de fin

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

Supprimer le Slash de fin

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

Rediriger une Seule Page

Redirect 301 /oldpage.html http://www.yoursite.com/newpage.html
Redirect 301 /oldpage2.html http://www.yoursite.com/folder/

Source

Alias pour un Seul Dossier

RewriteEngine On
RewriteRule ^source-directory/(.*) target-directory/$1

Alias de Chemins vers un Script

RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

Cet exemple a un fichier index.fcgi dans un répertoise, et toutes les requêtes à l'intérieur de ce dossier qui ne peuvent résoudre le fichier/dossier demandé seront renvoyées vers le script index.fcgi. C'est utile si vous voulez que baz.foo/some/cool/path soit pris en charge par baz.foo/index.fcgi (qui supporte aussi les requêtes vers baz.foo) tout en maintenant baz.foo/css/style.css ou autre fonctionnels.

Rediriger un Site Entier

Redirect 301 / http://newsite.com/

Ceci laisse les liens intacts. Ainsi, www.oldsite.com/some/crazy/link.html deviendra www.newsite.com/some/crazy/link.html. C'est très pratique quand vous voulez "bouger" un site vers un nouveau domaine. Source

Alias en URLs "propres"

Ce snippet vous permet d'utiliser les "URLs propres" -- celles sans extension PHP, ex: example.com/users à la place de example.com/users.php.

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]

Source

Securité

Refuser Tout Accès

## Apache 2.2
Deny from all

## Apache 2.4
# Require all denied

Mais… ceci vous bloquera de votre propre contenu aussi ! Donc voici…

Refuser Tout Accès Sauf Soi-même

## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx est votre IP. Si vous remplacez les 3 dernières numéro par 0/12 par exemple, ceci spécifiera un interval d'IPs à l'intérieur d'un même réseau, vous évitant ainsi de lister toutes les IPs autorisées individuellement. Source

Bien sûr, il y a la version inverse :

Autoriser Tout Accès Sauf Spammeurs

## Apache 2.2
Order deny,allow
Allow from all
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy

## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy

Refuser Accès aux Fichiers et Dossiers Cachés

Les fichiers et dossiers cachés (ceux dont les noms commencent pas un point .) devraient être la plupart, voire tout, le temps sécurisé. Par exemple : .htaccess, .htpasswd, .git, .hg...

RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]

Autre solution, vous pouvez lever une erreur Not Found, ne donnant aucun indice à l'attaquant :

RedirectMatch 404 /\..*$

Refuser Accès aux Sources et Fichiers de Sauvegarde

Ces fichiers peuvent être laissés par certains éditeurs texte/html (comme Vi/Vim) et poser un grand danger en terme de sécurité, quand quelqu'un y a accès.

<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
    ## Apache 2.2
    Order allow,deny
    Deny from all
    Satisfy All

    ## Apache 2.4
    # Require all denied
</FilesMatch>

Source

Désactiver la Navigation de Dossier

Options All -Indexes
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

Protéger un Dossier par Mot de Passe

D'abord, vous aurez besoin de créer un fichier .htpasswd quelque part sur le système :

htpasswd -c /home/fellowship/.htpasswd boromir

Ensuite, vous pouvez utiliser ceci pour authentification :

AuthType Basic
AuthName "One does not simply"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user

Protéger Un ou Plusieurs Fichiers par Mot de Passe

AuthName "One still does not simply"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd

<Files "one-ring.o">
Require valid-user
</Files>

<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>

Performance

Compresser les Fichiers Texte

<IfModule mod_deflate.c>

    # Force compression for mangled headers.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    <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>

    # Compresse toutes les sorties ayant un de ces types MIME
    # (pour Apache < 2.3.7, vous n'avez pas besoin d'activer `mod_filter`
    #  et vous pouvez supprimer le `<IfModule mod_filter.c>` et `</IfModule>`
    #  comme `AddOutputFilterByType` sera toujours dans les directives du noyau).
    <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>

Source

Donner l'En-tête "Expires"

Expires headers indique au navigateur s'il doit requêter un fichier spécifique du serveur ou bien se contenter du cache. On peut conseiller pour les contenus statiques un en-tête d'expiration loin dans le futur. Si vous n'utilisez pas la méthode du nom de fichier modifié par un système de contrôme de version, vous devriez diminuer le temps de cache des ressources telles que les fichiers CSS ou JS vers quelque chose proche de la semaine. Source

<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-woff2                "access plus 1 month"
    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>

Désactiver eTags

En retirant l'en-tête "eTag", vous empêchez le cache et les navigateurs de pouvoir valider les fichiers, ils sont donc forcer de se baser sur vous Cache-Control (Contrôle de Cache) et Expires header (En-tête d'expiration). Source

<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

Divers

Mettre en Place des Variables PHP

php_value <key> <val>

# Par exemple :
php_value upload_max_filesize 50M
php_value max_execution_time 240

Pages d'Erreur Personnalisées

ErrorDocument 500 "Houston, we have a problem."
ErrorDocument 401 http://error.yourdomain.com/mordor.html
ErrorDocument 404 /errors/halflife3.html

Forcer Téléchargement

Parfois, vous voulez forcer le navigateur à télécharger certains contenus au lieu de l'afficher. Le snippet suivant vous aidera.

<Files *.md>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>

Et il y a un yang pour ce yin:

Eviter Téléchargement

Parfois, vous voulez forcer le navigateur à afficher certains contenus au lieu de les télécharger. Le snippet suivant vous aidera.

<FilesMatch "\.(tex|log|aux)$">
    Header set Content-Type text/plain
</FilesMatch>

Autoriser les Polices Cross-Domain

Les polices desservies par un serveur CDN peuvent ne pas fonctionner sur Firefox ou IE à cause de CORS. Le snippet suivant de alrra devrait corriger cela.

<IfModule mod_headers.c>
    <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>

Encodage UTF-8 Auto

Votre contenu textuel devrait toujours être encodé en UTF-8, non ?

# Utiliser l'encodage UTF-8 pour tout ce qui est servi en text/plain ou text/html
AddDefaultCharset utf-8

# Forcer l'UTF-8 pour certains formats de fichier
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Source

Basculer vers une Autre Version de PHP

Si vous n'êtes pas sur un serveur mutualisé, Il y a des chances pour qu'il y ait plus d'une version de PHP installée, et parfois, vous voulez une version spécifique pour votre site web. Par exemple, Laravel nécessite PHP >= 5.4. Le snippet suivant devrait passer d'une version à l'autre de PHP pour vous.

AddHandler application/x-httpd-php55 .php

# Autrement, vous pouvez utiliser AddType
AddType application/x-httpd-php55 .php