2017-10-11 12:23:06 +02:00
|
|
|
|
# .htaccess Snippets [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome)
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
> Une collection utile de fragments de configuration de fichier `.htaccess`, le
|
|
|
|
|
> tout regroupé dans un seul endroit.
|
|
|
|
|
|
|
|
|
|
**Avertissement** : Bien que l'extrait mis dans un fichier `.htaccess` est la
|
|
|
|
|
plupart du temps suffisant, il ya des cas où certaines modifications pourraient
|
|
|
|
|
être nécessaires. À utiliser à vos propres risques.
|
|
|
|
|
|
|
|
|
|
**IMPORTANT** : Apache 2.4 a introduit quelques changements de rupture,
|
|
|
|
|
notamment dans la configuration de contrôle d'accès. Pour plus d'information,
|
|
|
|
|
consultez le
|
|
|
|
|
[document de mise à niveau](https://httpd.apache.org/docs/2.4/upgrading.html)
|
|
|
|
|
ainsi que [cette issue](https://github.com/phanan/htaccess/issues/2).
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Crédits
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Ce que nous faisons ici est principalement la collection d'extraits pratiques en
|
|
|
|
|
provenance d'un peu partout sur le web, par exemple, une bonne partie provient
|
|
|
|
|
du dépôt [Apache Server Configs](https://github.com/h5bp/server-configs-apache).
|
|
|
|
|
Bien qu'ayant essayé de créditer la bonne personne, des éléments peuvent être
|
|
|
|
|
manquants. 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Table des matières
|
|
|
|
|
|
|
|
|
|
- [Réécriture et redirection](#réécriture-et-redirection)
|
|
|
|
|
- [Forcer www](#forcer-www)
|
|
|
|
|
- [Forcer www d'une manière générique](#forcer-www-dune-manière-générique)
|
2015-02-24 12:16:41 +01:00
|
|
|
|
- [Forcer non-www](#forcer-non-www)
|
2017-10-11 12:23:06 +02:00
|
|
|
|
- [Forcer non-www d'une manière générique](#forcer-non-www-dune-manière-générique)
|
2015-02-24 12:16:41 +01:00
|
|
|
|
- [Forcer HTTPS](#forcer-https)
|
2017-10-11 12:23:06 +02:00
|
|
|
|
- [Forcer HTTPS derrière un proxy](#forcer-https-derrière-un-proxy)
|
|
|
|
|
- [Forcer le slash de fin](#forcer-le-slash-de-fin)
|
|
|
|
|
- [Supprimer le slash de fin](#supprimer-le-slash-de-fin)
|
|
|
|
|
- [Rediriger une seule page](#rediriger-une-seule-page)
|
|
|
|
|
- [Alias pour un seul dossier](#alias-pour-un-seul-dossier)
|
|
|
|
|
- [Alias de chemins vers un script](#alias-de-chemins-vers-un-script)
|
|
|
|
|
- [Rediriger un site entier](#rediriger-un-site-entier)
|
|
|
|
|
- [Alias en URLs propres](#alias-en-urls-propres)
|
|
|
|
|
- [Sécurité](#securité)
|
|
|
|
|
- [Refuser tout accès](#refuser-tout-accès)
|
|
|
|
|
- [Refuser tout accès sauf soi-même](#refuser-tout-accès-sauf-soi-même)
|
|
|
|
|
- [Autoriser tout accès sauf aux spammeurs'](#autoriser-tout-accès-sauf-aux-spammeurs)
|
|
|
|
|
- [Refuser l'accès aux fichiers et répertoires cachés](#refuser-laccès-aux-fichiers-et-dossiers-cachés)
|
|
|
|
|
- [Refuser l'accès aux sources et fichiers de sauvegarde](#refuser-laccès-aux-sources-et-fichiers-de-sauvegarde)
|
|
|
|
|
- [Désactiver la navigation de dossier](#désactiver-la-navigation-de-dossier)
|
|
|
|
|
- [Désactiver le hotlink des images](#désactiver-le-hotlink-des-images)
|
|
|
|
|
- [Désactiver le hotlink des images pour des domaines spécifiques](#désactiver-le-hotlink-des-images-pour-des-domaines-spécifiques)
|
|
|
|
|
- [Protéger un dossier par mot de passe](#protéger-un-dossier-par-mot-de-passe)
|
|
|
|
|
- [Protéger un ou plusieurs fichiers par mot de passe](#protéger-un-ou-plusieurs-fichiers-par-mot-de-passe)
|
2015-02-22 22:45:11 +01:00
|
|
|
|
- [Performance](#performance)
|
2017-10-11 12:23:06 +02:00
|
|
|
|
- [Compresser les fichiers texte](#compresser-les-fichiers-texte)
|
|
|
|
|
- [Ajouter l'en-tête "Expires"](#ajouter-len-tête-expires)
|
|
|
|
|
- [Désactiver eTags](#désactiver-etags)
|
2015-02-24 04:43:50 +01:00
|
|
|
|
- [Divers](#divers)
|
2017-10-11 12:23:06 +02:00
|
|
|
|
- [Définir des variables PHP](#définir-des-variables-php)
|
|
|
|
|
- [Pages d'erreur personnalisées](#pages-derreur-personnalisées)
|
|
|
|
|
- [Forcer le téléchargement](#forcer-le-téléchargement)
|
|
|
|
|
- [Empêcher le téléchargement](#empêcher-le-téléchargement)
|
|
|
|
|
- [Autoriser les polices Cross-Domain](#autoriser-les-polices-cross-domain)
|
|
|
|
|
- [Encodage UTF-8 automatique](#encodage-utf-8-automatique)
|
|
|
|
|
- [Basculer vers une autre version de PHP](#basculer-vers-une-autre-version-de-php)
|
|
|
|
|
- [Désactiver le mode de compatibilité pour Internet Explorer](#désactiver-le-mode-de-compatibilité-pour-internet-explorer)
|
|
|
|
|
- [Servir des images WebP](#servir-des-images-webp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Réécriture et redirection
|
|
|
|
|
|
|
|
|
|
Remarque: On suppose avoir le module `mod_rewrite` installé et activé.
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
### Forcer www
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine on
|
|
|
|
|
RewriteCond %{HTTP_HOST} ^example\.com [NC]
|
|
|
|
|
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Forcer www d'une manière générique
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteCond %{HTTP_HOST} !^$
|
|
|
|
|
RewriteCond %{HTTP_HOST} !^www\. [NC]
|
|
|
|
|
RewriteCond %{HTTPS}s ^on(s)|
|
|
|
|
|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
Cela fonctionne pour _tous_ les domaines.
|
|
|
|
|
[Source](https://stackoverflow.com/questions/4916222/htaccess-how-to-force-www-in-a-generic-way)
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
### Forcer non-www
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
C'est [toujours](http://www.sitepoint.com/domain-www-or-no-www/)
|
|
|
|
|
[en cours](https://devcenter.heroku.com/articles/apex-domains)
|
|
|
|
|
[de](http://yes-www.org/) [débat](http://no-www.org/) selon s'il faut
|
|
|
|
|
prévilégier la forme avec ou sans `www`, donc si vous êtes un fan de domaine
|
|
|
|
|
"à nu", ceci est pour vous :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine on
|
|
|
|
|
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
|
|
|
|
|
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Forcer non-www d'une manière générique
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
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]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
### Forcer HTTPS
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine on
|
|
|
|
|
RewriteCond %{HTTPS} !on
|
|
|
|
|
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Forcer HTTPS derrière un proxy
|
|
|
|
|
|
|
|
|
|
Ceci est utile si vous avez un proxy devant votre serveur faisant une
|
|
|
|
|
termination TLS :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteCond %{HTTP:X-Forwarded-Proto} !https
|
|
|
|
|
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Forcer le slash de fin
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteCond %{REQUEST_URI} /+[^\.]+$
|
|
|
|
|
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Supprimer le slash de fin
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
|
|
|
RewriteRule ^(.*)/$ /$1 [R=301,L]
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Rediriger une seule page
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Redirect 301 /anciennepage.html http://www.votresite.com/nouvellepage.html
|
|
|
|
|
Redirect 301 /anciennepage2.html http://www.votresite.com/dossier/
|
2015-02-22 22:45:11 +01:00
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
[Source](http://css-tricks.com/snippets/htaccess/301-redirects/)
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Alias pour un seul dossier
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
RewriteRule ^source-directory/(.*) target-directory/$1
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Alias de chemins vers un script
|
|
|
|
|
|
2015-02-24 04:43:50 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
FallbackResource /index.fcgi
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
Cet exemple a un fichier `index.fcgi` dans un répertoire, 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`. Ceci est utile si vous souhaitez
|
|
|
|
|
que `baz.foo/une/route/sympa` soit manipulé par `baz.foo/index.fcgi` (qui prend
|
|
|
|
|
également en charge les demandes vers `baz.foo`) tout en maintenant
|
|
|
|
|
`baz.foo/css/style.css` ou autre fonctionnels. Accédez au chemin d'origine de la
|
|
|
|
|
variable d'environnement `PATH_INFO`, comme exposé à votre environnement de
|
|
|
|
|
scriptage.
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
RewriteRule ^$ index.fcgi/ [QSA,L]
|
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
|
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
|
|
|
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Ceci est une version moins efficace de la directive `FallbackResource` (car
|
|
|
|
|
l'utilisation de `mod_rewrite` est plus complexe que de maintenir la directive
|
|
|
|
|
`FallbackResource`), mais offre d'avantage de flexibilité.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Rediriger un site entier
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Redirect 301 / http://nouveausite.com/
|
2015-02-22 22:45:11 +01:00
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Ceci laisse les liens intacts. Ainsi `anciensite.com/lien/super/genial.html`
|
|
|
|
|
deviendra `nouveausite.com/lien/super/genial.html`. Cela est très pratique
|
|
|
|
|
lorsque vous souhaitez déplacer un site vers un nouveau domaine.
|
|
|
|
|
|
|
|
|
|
[Source](http://css-tricks.com/snippets/htaccess/301-redirects/)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Alias en URLs propres
|
|
|
|
|
|
|
|
|
|
Ce snippet vous permet d'utiliser des "URLs propres" –celles sans extension–,
|
|
|
|
|
par exemple : `example.com/users` à la place de `example.com/users.php`.
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
RewriteCond %{SCRIPT_FILENAME} !-d
|
|
|
|
|
RewriteRule ^([^.]+)$ $1.php [NC,L]
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
[Source](http://www.abeautifulsite.net/access-pages-without-the-php-extension-using-htaccess/)
|
|
|
|
|
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
## Securité
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Refuser tout accès
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
## Apache 2.2
|
|
|
|
|
Deny from all
|
|
|
|
|
|
|
|
|
|
## Apache 2.4
|
|
|
|
|
# Require all denied
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Mais… ceci vous bloquera vous également ! Si ce n'est pas ce que vous souhaitez,
|
|
|
|
|
la partie suivante est sûrement faite pour vous !
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Refuser tout accès sauf soi-même
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
``` apacheconf
|
|
|
|
|
## 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
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
En remplaçant `xxx.xxx.xxx.xxx` par votre adresse IP, vous n'autoriserez l'accès
|
|
|
|
|
à votre site que par vous. Si vous remplacez les 3 dernièrs numéros par `0/12`
|
|
|
|
|
par exemple, ceci spécifiera un intervalle d'adresses IPs à l'intérieur d'un
|
|
|
|
|
même réseau, vous évitant ainsi de lister toutes les IPs autorisées
|
|
|
|
|
individuellement.
|
|
|
|
|
|
|
|
|
|
[Source](http://speckyboy.com/2013/01/08/useful-htaccess-snippets-and-hacks/)
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
Bien sûr, il y a la version inverse :
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Autoriser tout accès sauf aux spammeurs
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
## Apache 2.2
|
|
|
|
|
Order deny,allow
|
|
|
|
|
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
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Refuser l'accès aux fichiers et dossiers cachés
|
|
|
|
|
|
|
|
|
|
Les fichiers et dossiers cachés (ceux dont les noms commencent par un point `.`)
|
|
|
|
|
devraient être pour la majorité d'entre eux sécurisés. On ne devrait par exemple
|
|
|
|
|
pas avoir accès aux éléments suivants : `.htaccess`, `.htpasswd`, `.git`,
|
|
|
|
|
`.hg`...
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteCond %{SCRIPT_FILENAME} -d [OR]
|
|
|
|
|
RewriteCond %{SCRIPT_FILENAME} -f
|
|
|
|
|
RewriteRule "(^|/)\." - [F]
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Une autre solution serait de lever une erreur `404 Not Found`, ne donnant aucun
|
|
|
|
|
indice à l'attaquant quant à l'existance de la ressource :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RedirectMatch 404 /\..*$
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Refuser l'accès aux sources et fichiers de sauvegarde
|
|
|
|
|
|
|
|
|
|
Ces fichiers peuvent être laissés par certains éditeurs de texte/html (comme
|
|
|
|
|
Vi/Vim) et poser un grand danger en terme de sécurité, quand quelqu'un y a
|
|
|
|
|
accès.
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<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>
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
[Source](https://github.com/h5bp/server-configs-apache)
|
|
|
|
|
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
### Désactiver la navigation de dossier
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
Options All -Indexes
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Désactiver le hotlink des images
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine on
|
2017-10-11 12:23:06 +02:00
|
|
|
|
# Enlever la ligne ci-dessous si vous souhaitez bloquer le referrer vide
|
2015-02-22 22:45:11 +01:00
|
|
|
|
RewriteCond %{HTTP_REFERER} !^$
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?votredomaine.com [NC]
|
2015-02-24 04:43:50 +01:00
|
|
|
|
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
# Si vous souhaitez afficher une bannière "Bloquée" d'url 'blocked.png' au lieu
|
|
|
|
|
# du hotlink de l'image, replacez la règle ci-dessus par celle-ci :
|
|
|
|
|
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://votredomaine.com/blocked.png [R,L]
|
2015-02-24 04:43:50 +01:00
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Désactiver le hotlink des images pour des domaines spécifiques
|
|
|
|
|
|
|
|
|
|
Parfois vous souhaitez désactiver le hotlink d'images seulement pour quelques
|
|
|
|
|
domaines spécifiques. L'extrait suivant devrait vous aider :
|
|
|
|
|
|
2015-02-24 04:43:50 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine on
|
2017-10-11 12:23:06 +02:00
|
|
|
|
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?mauvaissite\.com [NC,OR]
|
|
|
|
|
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?mauvaissite2\.com [NC,OR]
|
2015-02-22 22:45:11 +01:00
|
|
|
|
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
# Si vous souhaitez afficher une bannière "Bloquée" d'url 'blocked.png' au lieu
|
|
|
|
|
# du hotlink de l'image, replacez la règle ci-dessus par celle-ci :
|
|
|
|
|
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://votredomaine.com/blocked.png [R,L]
|
2015-02-22 22:45:11 +01:00
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### 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, avec l'aide de la commande suivante :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` bash
|
|
|
|
|
htpasswd -c /home/fellowship/.htpasswd boromir
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Ensuite, vous pouvez utiliser ceci pour activer l'authentification :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
AuthType Basic
|
|
|
|
|
AuthName "One does not simply"
|
|
|
|
|
AuthUserFile /home/fellowship/.htpasswd
|
|
|
|
|
Require valid-user
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Protéger un ou plusieurs fichiers par mot de passe
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
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>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
## Performance
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Compresser les fichiers texte
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<IfModule mod_deflate.c>
|
|
|
|
|
|
|
|
|
|
# Force compression for mangled headers.
|
2015-08-14 12:40:01 +02:00
|
|
|
|
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
|
2015-02-22 22:45:11 +01:00
|
|
|
|
<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>
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
[Source](https://github.com/h5bp/server-configs-apache)
|
|
|
|
|
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
### Ajouter l'en-tête "Expires"
|
|
|
|
|
|
|
|
|
|
L'en-tête *Expires* indique au navigateur s'il doit effectuer une requête au
|
|
|
|
|
serveur pour récupérer un fichier spécifique 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ôle 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.
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<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>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
[Source](https://github.com/h5bp/server-configs-apache)
|
|
|
|
|
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
### Désactiver eTags
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
En retirant l'en-tête "eTag", vous empêchez le cache et les navigateurs de
|
|
|
|
|
pouvoir valider les fichiers, ils sont donc forcés de se baser sur le
|
|
|
|
|
Cache-Control (contrôle de cache) et les Expires header (en-tête d'expiration).
|
|
|
|
|
|
|
|
|
|
[Source](http://www.askapache.com/htaccess/apache-speed-etags.html)
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<IfModule mod_headers.c>
|
|
|
|
|
Header unset ETag
|
|
|
|
|
</IfModule>
|
|
|
|
|
FileETag None
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Divers
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
### Définir des variables PHP
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
php_value <key> <val>
|
|
|
|
|
|
|
|
|
|
# Par exemple :
|
|
|
|
|
php_value upload_max_filesize 50M
|
|
|
|
|
php_value max_execution_time 240
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Pages d'erreur personnalisées
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
2017-10-11 12:23:06 +02:00
|
|
|
|
ErrorDocument 500 "Houston, on a un problème."
|
|
|
|
|
ErrorDocument 401 http://error.votredomaine.com/mordor.html
|
2015-02-22 22:45:11 +01:00
|
|
|
|
ErrorDocument 404 /errors/halflife3.html
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Forcer le téléchargement
|
|
|
|
|
|
|
|
|
|
Parfois, vous souhaitez forcer le navigateur à télécharger certaines ressources
|
|
|
|
|
au lieu de les afficher. Le snippet suivant vous sera utile :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<Files *.md>
|
|
|
|
|
ForceType application/octet-stream
|
|
|
|
|
Header set Content-Disposition attachment
|
|
|
|
|
</Files>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
Si vous souhaitez l'action inverse :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Empêcher le téléchargement
|
|
|
|
|
|
|
|
|
|
Parfois, vous souhaitez forcer le navigateur à afficher certains contenus au
|
|
|
|
|
lieu de les télécharger. Le snippet suivant devrait vous aider :
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
``` apacheconf
|
|
|
|
|
<FilesMatch "\.(tex|log|aux)$">
|
|
|
|
|
Header set Content-Type text/plain
|
|
|
|
|
</FilesMatch>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
### Autoriser les polices Cross-Domain
|
|
|
|
|
|
|
|
|
|
Les polices desservies par un serveur CDN peuvent ne pas fonctionner sur Firefox
|
|
|
|
|
ou IE à cause de
|
|
|
|
|
[CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing). Le snippet
|
|
|
|
|
suivant de [alrra](https://github.com/h5bp/server-configs-apache/issues/32)
|
|
|
|
|
devrait corriger cela :
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
<IfModule mod_headers.c>
|
|
|
|
|
<FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
|
|
|
|
|
Header set Access-Control-Allow-Origin "*"
|
|
|
|
|
</FilesMatch>
|
|
|
|
|
</IfModule>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
### Encodage UTF-8 automatique
|
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
Votre contenu textuel devrait toujours être encodé en UTF-8, non ?
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
``` apacheconf
|
|
|
|
|
# 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
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-22 22:45:11 +01:00
|
|
|
|
[Source](https://github.com/h5bp/server-configs-apache)
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Basculer vers une autre version de PHP
|
|
|
|
|
|
|
|
|
|
Si vous êtes 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 avez besoin d'une version
|
|
|
|
|
spécifique pour votre site web.
|
|
|
|
|
|
|
|
|
|
Par exemple [Laravel](https://github.com/laravel/laravel) nécessite PHP >= 5.4.
|
|
|
|
|
Le snippet suivant devrait passer d'une version à l'autre de PHP pour vous :
|
2015-02-22 22:45:11 +01:00
|
|
|
|
|
|
|
|
|
``` apacheconf
|
|
|
|
|
AddHandler application/x-httpd-php55 .php
|
|
|
|
|
|
|
|
|
|
# Autrement, vous pouvez utiliser AddType
|
|
|
|
|
AddType application/x-httpd-php55 .php
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Désactiver le mode de compatibilité pour Internet Explorer
|
|
|
|
|
|
|
|
|
|
Le mode de compatibilité dans IE peut affecter l'affichage de certains sites
|
|
|
|
|
web. L'extrait suivant devrait forcer IE à utiliser le moteur d'interprétation
|
|
|
|
|
Edge et ainsi désactiver le mode de compatibilité.
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
|
|
|
|
``` apacheconf
|
|
|
|
|
<IfModule mod_headers.c>
|
|
|
|
|
BrowserMatch MSIE is-msie
|
|
|
|
|
Header set X-UA-Compatible IE=edge env=is-msie
|
|
|
|
|
</IfModule>
|
|
|
|
|
```
|
|
|
|
|
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
|
|
|
|
### Servir des images WebP
|
|
|
|
|
|
|
|
|
|
Si [WebP images](https://developers.google.com/speed/webp/?csw=1) est supporté
|
|
|
|
|
et que l'image avec l'extension `.webp` a le même nom qu'une image jpg/png alors
|
|
|
|
|
l'image Webp sera servie à la place.
|
2015-02-24 04:43:50 +01:00
|
|
|
|
|
|
|
|
|
``` apacheconf
|
|
|
|
|
RewriteEngine On
|
|
|
|
|
RewriteCond %{HTTP_ACCEPT} image/webp
|
|
|
|
|
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
|
|
|
|
|
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
|
|
|
|
|
```
|
2017-10-11 12:23:06 +02:00
|
|
|
|
|
2015-02-24 04:43:50 +01:00
|
|
|
|
[Source](https://github.com/vincentorback/WebP-images-with-htaccess)
|