404 vs 403 lorsque l’index de répertoire est manquant

C’est principalement une question philosophique sur la meilleure façon d’interpréter les spécifications HTTP. Un répertoire sans index de répertoire (par exemple index.html) doit-il renvoyer 404 ou 403? (403 est la valeur par défaut dans Apache.)

Par exemple, supposons que les URL suivantes existent et soient accessibles:

http://example.com/files/file_1/ http://example.com/files/file_2/ 

Mais il n’y a rien à:

 http://example.com/files/ 

(Supposons que nous utilisons 301 pour forcer les barres obliques de fin pour toutes les URL.)

Je pense que plusieurs choses doivent être sockets en compte:

  • Par défaut, Apache renvoie 403 dans ce scénario. C’est important pour moi. Ils ont réfléchi à ces choses et ils ont pris la décision d’utiliser 403.
  • Selon le W3C, 403 signifie “Le serveur a compris la requête, mais refuse de la satisfaire”. Je suppose que cela signifie que vous devez retourner 403 si l’URL est significative mais néanmoins interdite.
  • 403 peut entraîner la divulgation d’informations si le client devine correctement que l’URL correspond à un répertoire réel sur le disque.
  • http://example.com/files/ n’est pas une ressource et le fait qu’il soit mappé en interne vers un répertoire ne doit pas être pertinent pour le code d’état.
  • Si vous interprétez le schéma d’URL comme définissant une structure de répertoire du sharepoint vue du client , l’implémentation interne n’a toujours pas d’importance, mais peut-être que l’apparence extérieure devrait avoir une incidence sur les codes d’état. Peut-être, même si vous avez créé la même structure d’URL sans utiliser de répertoires en interne, vous devez toujours utiliser les 403, car cela concerne la perception du client d’une structure de répertoire.

Selon vous, quelle est la meilleure approche? Doit-on simplement dire “une ressource est une ressource et si elle n’existe pas, c’est une 404?” Ou devrions-nous dire, “s’il a des barres obliques, cela ressemble à un répertoire pour le client, et par conséquent c’est un 403 s’il n’y a pas d’index?”

Si vous êtes dans le camp 403, pensez-vous que vous devriez vous efforcer de retourner les 403 même si la mise en œuvre interne n’utilise pas de répertoires? Supposons, par exemple, que vous ayez une application Web dynamic avec cette URL: http://example.com/users/joe , qui correspond à un code qui génère la page de profil pour Joe. En supposant que vous n’écriviez pas quelque chose qui répertorie tous les utilisateurs, http://example.com/users/ devrait renvoyer 403? (Beaucoup, sinon tous les frameworks Web renvoient 404 dans ce cas.)

La première étape pour y répondre est de se référer à la RFC 2616: HTTP / 1.1 . Plus précisément, les sections traitant de 403 Interdit et 404 Introuvable .

  • 10.4.4 403 Interdit

Le serveur a compris la demande, mais refuse de la satisfaire. L’autorisation ne va pas aider et la demande NE DOIT PAS être répétée. Si la méthode de requête n’était pas HEAD et que le serveur souhaitait rendre publique la raison pour laquelle la demande n’a pas été satisfaite, il DEVRAIT décrire la raison du refus dans l’entité. Si le serveur ne souhaite pas mettre ces informations à la disposition du client, le code d’état 404 (non trouvé) peut être utilisé à la place.

  • 10.4.5 404 Introuvable

Le serveur n’a rien trouvé correspondant à l’URI de demande. Aucune indication n’est donnée quant à savoir si la condition est temporaire ou permanente. Le code d’état 410 (Gone) DEVRAIT être utilisé si le serveur sait, via un mécanisme configurable en interne, qu’une ancienne ressource est définitivement indisponible et n’a pas d’adresse de transfert. Ce code d’état est couramment utilisé lorsque le serveur ne souhaite pas révéler exactement pourquoi la demande a été refusée ou lorsqu’aucune autre réponse n’est applicable.

Mon interprétation de cela est que 404 est le code d’erreur plus général qui dit simplement “il n’y a rien là”. 403 dit “il n’y a rien là-bas, ne réessayez pas!”.

Une des raisons pour lesquelles Apache pourrait renvoyer 403 sur des répertoires sans fichiers d’index explicites est que l’indexation automatique (c’est-à-dire la liste de tous les fichiers) est désactivée (aka “interdit”). Dans ce cas, il est plus logique de dire “lister tous les fichiers de ce répertoire” que de dire “il n’y a pas de répertoire”.

Un autre argument pour lequel 404 est préférable: google webmaster tools.

En effet, pour un 404, Google Webmaster Tool affiche le référent (vous permettant de nettoyer le mauvais lien vers le répertoire), alors que pour un 403, il ne l’affiche pas.