Au démarrage (ou en reload), Apache charge son fichier de configuration.
Les fichiers .htaccess sont des fichiers de configuration Apache qui
permettent de venir modifier ces règles, pour contrôler le comportement
du serveur web pour le dossier dans lequel il est, ainsi que les
sous-répertoires, si le serveur permet l'Override avec AllowOverride.

Les .htaccess sont utiles pour la sécurité du site web

sous UNIX comme le nom .htaccess commence par un point, c'est un
fichier caché .
On peut leur donner un autre nom selon la configuration du serveur avec
la directive AccessFilename.


Pages d'erreur perso

Créer des pages html et un fichier .htaccess placé à la racine du site ou un dossier en particulier:
# Pages d'erreur HTTP perso
ErrorDocument 404 /error_404.html
ErrorDocument 403 /error_403.html
Voir ce script PHP qui génère des pages HTML statiques des codes d'erreur HTTP et le code pour fichier .htaccess.

Protéger un dossier par mot de passe

AuthName "Page d'administration protégée, veuillez vous identifier"
AuthType Basic
#AuthUserFile "/home/dossier/www/votre-repertoire/admin/.htpasswd"
AuthUserFile "D:\Lab\web\.htpasswd"
Require valid-user
Ici ce fichier est situé en dehors du répertoire de publication. Possible en local, mais pas forcément en prod. Pour connaître le chemin absolu :
<?php
echo realpath("chemin-absolu.php");
?>
Le fichier d'utilisateurs/mots de passe:
nom-utilisateur1:mot_de_passe
nom-utilisateur2:motdepasse
nom-utilisateur3:password
Pour encrypter un mot de passe:
<?php
//echo crypt('4af3pr9yd25fr_Tr');
password_hash('4af3pr9yd25fr_Tr', PASSWORD_DEFAULT);

produit $2y$10$B616ft29UAYlbrU3zf.V9.DLy9UyQTwGygZAOS0yD.MYt1DAS7Hv2
crypt() produit un warning, mais selon la doc c'est la bonne méthode. Comme je ne compte pas voir le contenu de dossiers il contient un nom d'utilisateur très compliqué. Au final le fichier .htpassword :
kQOpBEPU$XDMwUCCwu1q0EFOJFOX5C:$1$TTXGesUj$qTIqYUAv7qq8tx43G3x/51
Ce fichier sera nommé différemment, il ne sera pas dans le répertoire de publication. S'il l'est il sera protégé: Pour Apache 2.2
<Files .DOMINFO>
Order allow,deny
Deny from all
</Files>
Pour Apache 2.4
<Files .DOMINFO>
Require all denied
</Files>
Apache est livré avec un utilitaire pour créer le fichier .htpassword. Garder ce fichier en dehors du répertoire de publication, pour que les clients ne puissent pas le télécharger. Apache24/bin Apache24/.htpassword Apache24/htdocs L'utilitaire demande de saisir le mot de passe:
D:\>cd D:\Lab\web\Apache24\bin

D:\Lab\web\Apache24\bin>htpasswd -c D:/Lab/web/Apache24/.htpasswd2 Joe
New password: **********
Re-type new password: **********
Adding password for user Joe

D:\Lab\web\Apache24\bin>
En local, pour que le htaccess fonctionne il ne faut pas définir un Allowoverride trop restrictif:
DocumentRoot "D:\Lab\web\htdocs"
<Directory "D:\Lab\web\htdocs">
    Options Indexes FollowSymLinks

    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #AllowOverride None
    AllowOverride All

    Require all granted
</Directory>

Appliquer des règles selon l'extension du fichier

<Files ~ "\.(htm|html|css|js|php)$">
AddDefaultCharset UTF-8
DefaultLanguage en-US
</Files>
Cette règle cible les fichiers qui terminent par .htm .html .css .js .php FilesMatch devrait être employé au lieu de Files quand il faut traiter plusieurs fichiers:
<FilesMatch "\.(html|htm)$">
AddDefaultCharset utf-8
DefaultLanguage en-us
</FilesMatch>
Cette règle cible les fichiers qui se terminent par .htm et .html

Appliquer des règles selon le nom du fichier

<FilesMatch "^(admin|staff)\.php$">
AuthName "Dialog prompt"
AuthType Basic
AuthUserFile /web/username/.htpasswd
Require valid-user
</FilesMatch>
Cible les fichiers qui commencent par admin ou staff et terminent par .php

Expressions régulières

^ commence par $ finit par Tout ce qui commence et finit par slash sera redirigé vers l'accueil :
RewriteRule ^/$ /accueil.html [R] 
R c'est Redirect L'utilisation du drapeau [R] provoque l'envoi d'une redirection au navigateur. Quand index.html sera demandé, redirigé vers accueil.html
RewriteRule ^/index.html$ /accueil.html [R] 

Duplicate Content

Parfois une page est accessible par deux URL: http://www.domaine.fr/dos/page.html http://dos.domaine.fr/page.html Il faut empêcher ce phénomène qui ne favorise pas le PageRank. Tout ce qui ne commence PAS par www.masta.fr sera redirigé vers www.masta.fr :
RewriteCond %{HTTP_HOST} !^www.masta.fr$
RewriteRule ^(.*) http://www.masta.fr/$1 [QSA,L,R=301] 
L c'est Last

URLrewriting sur pagination

Avec cette règle,
RewriteRule ^page([0-9]*)$ /index.php?page=$1 
http://www.masta.fr/page1 deviendra http://www.masta.fr/index.php?page=1 Avec cette règle,
RewriteRule "/pages/(.+)" "/page.php?page=$1" 
/pages/123?one=two sera réécrite en /page.php?page=123&one=two et ça c'est bon pour le PageRank. L'utilisation du drapeau [F] permet de faire envoyer par le serveur au client un code de statut "403 Forbidden". Le même effet peut être obtenu à l'aide de la directive Deny, mais ce drapeau offre plus de souplesse dans l'attribution d'un statut Forbidden. La règle suivante va interdire la téléchargement de fichiers .exe depuis votre serveur.
RewriteRule "\.exe" "-" 
Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune raison de réécrire un URI, si vous avez l'intention d'interdire la requête. Lorsqu'on utilise [F], [L] est implicite - c'est à dire que la réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée. https://www.ionos.fr/digitalguide/hebergement/aspects-techniques/les-meilleures-astuces-htaccess/
<Location />
require all granted
</Location>

#Note that you dont need to use require all denied
#to require only a group of ips.. 
<Location /adm>
require ip myniceip
</Location>

<Location /disabled>
Require all denied
</Location>
# Apache 2.2
deny from all 
allow from ip1
allow from ip2

# Apache 2.4
require ip1 
require ip2
Si le site comporte htacess+htpasswd, les IPs de confiance ne saisissent pas de mot de passe, les autres oui.
# Apache 2.4
<RequireAll>
    <RequireAny>
        Require ip1
        Require ip2
     </RequireAny>
    Require valid-user
</RequireAll>
dans un bloc virtualhost on peut créer une variable d'environnement: SetEnv APPLICATION_ENV production inclure un fichier conf Include conf-available/server-ssl.conf

Favicon.ico

En parcourant les logs Apache, /favicon.ico représente 11000 octets inutiles à chaque requête. Certains navigateurs le demandent automatiquement même si la page HTML ne contient pas de # 1re solution quand favicon.ico est demandé sort direct un 404
Redirect 404 /favicon.ico
# aurait pu être écrit ainsi
<Files /favicon.ico>
    ErrorDocument 404 "No favicon"
</Files>
# la méthode ici à éviter, préférer le Redirect (ici en 410 Gone)
RewriteEngine On
# if requested file is not an existing file
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f 
# and it's name is favicon.ico, send an empty 410 GONE response to the browser
RewriteRule .*favicon\.ico$ - 
# 2e solution créer un fichier vide nommé favicon.ico. # et un vrai fichier png avec canal pour la prod.

Hotlinking

Quand un site web utilise les ressources d'un autre site. Donc quelqu'un sur un forum ne pourra pas montrer vos belles images et vous faire de la pub. Chacun fait comme il le sent. Ca peut servir à protéger un dossier de photos privées.
# interdire le hotlinking
RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://[-_a-z0-9.]*mondomaine\.tld$ [NC] 
RewriteCond %{HTTP_REFERER} !^http://[-_a-z0-9.]*mondomaine\.tld/.*$ [NC] 
RewriteCond %{HTTP_REFERER} !^http://60gp\.ovh\.net/~loginftp/.*$ [NC] 
RewriteRule .*\.(gif|jpe?g?|jp2|png|svgz?|ico|css|pdf|zip|gz|js|mp3|m4a|mp4|mov|divx|avi|wma?v?|wmp|swf|flv|docx?|xlsx?|pptx?|vbs|rtf|asf?x?|odt|ods|odp|odg|odb)$ - [NC,F]

#autre façon d'interdire le hotlinking
RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?tranquille-informatique.fr/.*$ [NC]
ReWriteRule .(gif|png|jpe?g|swf|flv)$ - [F]

#autre façon d'interdire le hotlinking
RewriteEngine on 
RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_HOST}/*'"
RewriteRule "^/images" "-" 
------------------------------------------------------------------------

Liens

mon générateur de .htaccess (Javascript) Howto officiel sur les htaccess Les flags de rewrite