web-dev-qa-db-fra.com

Comment avoir .htaccess display 404.html pour les pages enfants

Je travaille sur un site Web example.com comportant une page d'erreur example.com/404.html.

Voici tout mon fichier .htaccess (Apache):

# Forces HTTPS

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] 

# 404 redirect

ErrorDocument 404 /404.html

# Disables directory indexing (being able to view a list of files instead of the actual webpage)

Options -Indexes

J'utilise relative 404 pour afficher le contenu de la page d'erreur 404 sans rediriger réellement l'utilisateur (et donc modifier l'URL). Cela fonctionne très bien pour les pages de niveau supérieur comme example.com/nonexistentpage.html.

Cependant, je ne suis pas sûr de savoir comment gérer les pages enfants, comme example.com/parent/nonexistentpage.html.

Actuellement, j'ai dupliqué ma page 404.html existante, je l'ai modifiée avec ../ dans toutes les références d'URL afin qu'elle recherche les ressources au bon emplacement et j'ai mis le nouveau "enfant" 404.html pages dans chacun de mes dossiers "parents" contenant des pages enfants. Lorsque j'accède à example.com/parent/404.html, la page d'erreur s'affiche correctement avec tous les styles et les liens où ils devraient se trouver. Cependant, lorsque j'accède à example.com/parent/nonexistentpage.html, bien que l'URL ne change pas, je reçois un message d'erreur générique et sans style 404 au lieu de ma page personnalisée 404.html.

Est-ce que je manque quelque chose/fais quelque chose de mal? L'objectif est que le contenu de la page d'erreur s'affiche lors de l'accès à des pages enfants inexistantes sans rediriger/modifier l'URL réelle. J'ai aussi essayé de commenter Options -Indexes, mais cela n'a eu aucun effet.

Merci pour toute aide/suggestions.

2
heyycap

Vous ne devriez rien faire. Vous serviriez normalement le même ErrorDocument quelle que soit l'URL à l'origine de l'erreur. Dans votre cas, vous desservez /404.html à la racine du document de votre site.

Toutefois, il semble que vous utilisiez des URL relatives vers vos ressources statiques dans votre document d'erreur. Cela ne fonctionnera jamais (sauf si vous définissez une balise base) - mais ce n'est pas sans ses mises en garde - voir le lien de référence ci-dessous) puisque le document d'erreur pourrait être servi de n'importe où et que le navigateur résoudra vos URL relatives de manière incorrecte (ou du moins, pas comme vous vouliez). Vous devez plutôt utiliser des URL relatives à la racine (commençant par une barre oblique, comme vous l'avez fait pour /404.html) ou des adresses absolues (y compris schéma + nom d'hôte).

lorsque j'accède à example.com/parent/nonexistentpage.html, bien que l'URL ne change pas, un message d'erreur générique et sans style 404 s'affiche.

En supposant que votre directive ErrorDocument soit toujours définie pour servir /404.html et que vous utilisez des chemins relatifs dans /404.html, tous les chemins d’URL relatifs seront naturellement résolus par rapport au répertoire /parent " ", pas la racine du document, comme ce serait le cas si vous demandiez example.com/nonexistentpage.html.

N'oubliez pas que c'est le navigateur qui résout les URL relatives, en fonction de l'URL demandée. Cela n'a rien à voir avec le chemin du système de fichiers sur votre serveur.

Voir cette autre question connexe pour des exemples supplémentaires et une discussion sur l'utilisation de la balise base:

1
MrWhite