Les fichiers .htaccess

CAS DE FIGURE GÉNÉRAUX

Activer toutes les options sauf l’affichage du contenu des répertoires (rmq : ni Multiviews) :

Options All -Indexes

Désactiver uniquement l’affichage du contenu des répertoires :

Options -Indexes

Activer uniquement le suivi des liens symboliques :

Options +FollowSymLinks

Masquer les informations du serveur :

ServerSignature Off

Spécifier le fuseau horaire :

SetEnv TZ Europe/Paris

Ou, alternativement :

php_value date.timezone Europe/Paris

Encodage par défaut des fichiers textes et HTML :

AddDefaultCharset UTF-8

Protéger les fichiers .htaccess et .htpasswds :

<Files ~ "^.*\.([Hh][Tt][AaPp])">
	order allow,deny
	deny from all
	satisfy all
</Files>

Désactiver le hotlinking de vos images :

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?opensharing.priv [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://fakeimg.pl/400x200/?text=Pas_touche_aux_images [NC,R,L]

</IfModule>

Bannir une adresse IP :

<Limit GET POST>
order allow,deny
deny from xxx.xxx.xxx.xxx
allow from all
</Limit>

Empêcher les visiteurs de ces sites d’accéder au votre :

<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{HTTP_REFERER} site1.com [NC,OR]
RewriteCond %{HTTP_REFERER} site2.com [NC,OR]
RewriteRule .* - [F]

</IfModule>

Rediriger les visiteurs venant d’un site vers un autre :

<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{HTTP_REFERER} sitesource\.com/
RewriteRule ^(.*)$ http://www.sitedestination.com [R=301,L]

</IfModule>

Redirection d’une page quelconque :

Redirect 301 /anciennepage/ http://opensharing.priv/nouvellepage

Redirection du site sans www vers www :

<IfModule mod_rewrite.c>

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

</IfModule>

Redirection du site avec www vers la version sans www :

<IfModule mod_rewrite.c>

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

</IfModule>

Redirection vers HTTPS :

<IfModule mod_rewrite.c>

RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

</IfModule>

Forcer le téléchargement pour ces types de fichiers :

AddType application/octet-stream .doc .docx .xls .xlsx .csv .mp3 .mp4

Rediriger vers une page de maintenance personnalisée sauf pour mon adresse IP :

<IfModule mod_rewrite.c>

RewriteEngine on
RewriteCond %{REQUEST_URI} !/maintenance.html$
RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx
RewriteRule $ /maintenance.html [R=302,L]

</IfModule>

Mise en cache des fichiers dans le navigateur :

<IfModule mod_expires.c>

ExpiresActive On
ExpiresDefault "access plus 1 month"

ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/pdf "access plus 0 seconds"

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

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

ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"

ExpiresByType video/ogg "access plus 1 month"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"

ExpiresByType text/css "access plus 6 month"
ExpiresByType application/javascript "access plus 6 month"

ExpiresByType application/x-shockwave-flash "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"

</IfModule>

# En-têtes
Header unset ETag
FileETag None

<ifModule mod_headers.c>

<filesMatch "\.(ico|jpe?g|png|gif|swf)$">  
    Header set Cache-Control "public"  
</filesMatch>  
<filesMatch "\.(css)$">  
    Header set Cache-Control "public"  
</filesMatch>  
<filesMatch "\.(js)$">  
    Header set Cache-Control "private"  
</filesMatch>  
<filesMatch "\.(x?html?|php)$">  
    Header set Cache-Control "private, must-revalidate"
</filesMatch>

</ifModule>

Compressions des fichiers statiques :

<IfModule mod_deflate.c>

    AddOutputFilterByType DEFLATE text/xhtml text/html text/plain text/xml text/javascript application/x-javascript text/css 
    BrowserMatch ^Mozilla/4 gzip-only-text/html 
    BrowserMatch ^Mozilla/4\.0[678] no-gzip 
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary 
    Header append Vary User-Agent env=!dont-vary

</IfModule>  

AddOutputFilterByType DEFLATE text/html  
AddOutputFilterByType DEFLATE text/plain  
AddOutputFilterByType DEFLATE text/xml  
AddOutputFilterByType DEFLATE text/css  
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json

Protection contre les injections de fichiers :

<IfModule mod_rewrite.c>

RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC]
RewriteRule .* - [F]

</IfModule>

Protections diverses (XSS, clickjacking et MIME-Type sniffing) :

<ifModule mod_headers.c>

Header set X-XSS-Protection "1; mode=block"
Header always append X-Frame-Options SAMEORIGIN
Header set X-Content-Type-Options: "nosniff”

</ifModule>

Limiter l’accès à un répertoire à certaines adresses IP :

<Limit GET POST PUT>
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
allow from xxx.xxx.xxx.xxx
</Limit>

CAS PROPRES À WORDPRESS

Rmq : Les règles custom doivent être ajoutées en dehors des balises # BEGIN | END WordPress. Dans le cas contraire, elles seraient supprimées.

Fichier .htaccess présent par défaut à la racine du site :

# 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

Protéger le fichier wp-config.php :

<files wp-config.php>
order allow,deny
deny from all
</files>

Éviter le spam de commentaires :

<IfModule mod_rewrite.c>

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
RewriteCond %{HTTP_REFERER} !.opensharing.priv.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

</IfModule>

Éviter qu’on puisse déterminer l’identifiant d’un utilisateur par son identifiant numérique :

<IfModule mod_rewrite.c>

RewriteCond %{QUERY_STRING} ^author=([0-9]*)
RewriteRule .* - [F]

</IfModule>

Vérification avec :

http://mysite.opensharing.priv/?author=1

Bloquer l’utilisation de certains scripts :

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]

</IfModule>

Seconde authentification pour l’accès au répertoire wp-admin (y placer le fichier .htaccess ci-dessous) :

<Files admin-ajax.php>
Order allow,deny
Allow from all
Satisfy any 
</Files>

AuthName "Connexion à l'administration"
AuthType Basic
AuthUserFile "/chemin/complet/vers/le/fichier/.htpasswd"

Require valid-user

Bloquer les accès directs aux fichiers PHP du répertoire wp-includes (y placer le fichier .htaccess suivant) :

<Files wp-tinymce.php>
allow from all
</Files>
<FilesMatch "\.(?i:php)$">
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>
<Files wp-tinymce.php>
  Allow from all
</Files>
<Files ms-files.php>
  Allow from all
</Files>

Bloquer les accès directs aux fichiers PHP du répertoire wp-content (y placer le fichier .htaccess suivant) :

<FilesMatch "\.(?i:php)$">
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>

Bloquer les accès directs aux fichiers PHP du répertoire wp-content/uploads/ (y placer le fichier .htaccess suivant) :

<FilesMatch "\.(?i:php)$">
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Deny from all
  </IfModule>
  <IfModule mod_authz_core.c>
    Require all denied
  </IfModule>
</FilesMatch>
Fermer le menu