Utilitaires
Scripts
Divers
Jeux
Rechercher
Quillevere.net
Paradigmes informatiques

Sur Apache, renvoyer un code HTTP spécifique si un fichier est absent

20/10/2023

Sur un site Web, il peut y avoir des règles de réécritures pour indiquer au serveur l'emplacement réel des fichiers demandés par le navigateur. Ces règles sont présentes dans le fichier .htaccess, via l'instruction RewriteRule. Celle-ci interprète les expressions régulières si besoin.

Dans le cas où le fichier réécrit n'est pas présent, un code HTTP 404 est automatiquement renvoyé au client. Il est cependant parfois pratique de renvoyer un autre code de réponse HTTP, tel que le code 301 (Move Permanently). Deux cas peuvent alors se présenter selon la similitude entre l'URL appelée et l'arborescence côté serveur.

Cas 1 : l'arborescence du serveur est proche de l'URL appelée

Si l'URL appelée est https://serveur/photos/test.jpg et que l'emplacement côté serveur est medias/photos/test.jpg, on peut créer facilement la règle de réécriture :

RewriteRule ^photos/(.*)$ /medias/$1 [L]

On peut aussi vérifier la présence du fichier au préalable et gérer la redirection en cas d'absence du fichier demandé :

# Vérifier si le fichier existe
RewriteCond %{DOCUMENT_ROOT}/medias/%{REQUEST_URI} !-f

# Redirige l'URL vers une image par défaut, avec un code 301
RewriteRule ^photos/(.*)$ /medias/img/defaut.gif [R=301,L]

# Réécriture de l'emplacement du fichier, sans redirection
RewriteRule ^photos/(.*)$ /medias/img/$1 [L]

Cas 2 : le nom du fichier et/ou son emplacement sont variables

Cela se complique si le nom complet du fichier ne reflète pas l'arborescence du serveur. Dans l'exemple ci-dessous, le chemin du fichier peut être dans 3 emplacements et son nom réel est préfixé par 'fic-':

RewriteRule ^photos/(grande|moyenne|petite)/([a-zA-Z])\.(jpg|webp)$ /medias/$1/$2/fic-$3.$4

Il faudrait tester plusieurs emplacement et plusieurs noms de fichiers...

Voici comment tester le nom du fichier généré à posteriori :

  • on ajoute une variable d'environnement sur la règle de réécriture. Cette variable ne sera initialisée qu'en cas d'application de la réécriture (donc si un fichier remplit les conditions de nommage).
  • on omet le drapeau L (Last) car sinon l'erreur 404 sera renvoyée si le fichier est inexistant.
  • on ajoute 2 conditions avec RewriteCond (qui s'enchaînent avec un AND implicite) :
    • la 1ère condition vérifie qu'une réécriture a été faite auparavant
    • la seconde condition vérifie si le nouveau nom de fichier est absent de l'emplacement prévu
  • enfin, si ces 2 conditions sont remplies, on redirige vers une image par défaut, avec un code 301.
RewriteRule ^photos/(grande|petite)/([a-zA-Z])\.(jpg|webp)$ /medias/$1/$2/$3.$4 [E=ImageTrouvee:1]

# Si une photo n'est pas trouvée, redirige vers une photo par défaut
RewriteCond %{ENV:ImageTrouvee} =1
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^ /medias/img/defaut.gif [L,R=301]

Ces 2 solutions permettent ainsi à votre site Internet de ne pas renvoyer d'erreur 404 si une image est absente, mais plutôt un code qui précise aux moteurs de recherches (tels que Google) que vous n'avez pas des fichiers référencés obsolètes/mal reliés mais plutôt un contenu qui a évolué et qui n'existe plus sur votre site.

Dernière modification le 20/10/2023 - Quillevere.net

Commentaires

Aucune inscription n'est requise si vous souhaitez

Rechercher sur le site

fr en rss RSS info Informations