186 votes

Qu'est-ce que corriger le code d'état HTTP lors de la redirection vers une page de connexion?

Lorsqu'un utilisateur n'est pas connecté et tente d'accéder à une page qui nécessite une connexion, est-ce le bon code de statut HTTP pour une redirection vers la page de connexion?

Je demande car aucun des 3xx codes de réponse défini par le W3C semblent pour s'adapter aux exigences:

10.3.1 300 À Choix Multiples

La ressource demandée correspond à tout un ensemble de représentations, chacune avec sa propre emplacement, et à l'agent de négociation menée de l'information (section 12) est fourni de manière à ce que l'utilisateur (ou de l'utilisateur l'agent) peuvent choisir un préféré la représentation et la réorienter ses demande à cet emplacement.

Sauf si c'était un CHEF de demande, l' la réponse DOIT inclure une entité contenant une liste de ressources les caractéristiques et l'emplacement(s) de laquelle l'utilisateur ou de l'agent utilisateur peut choisissez celui qui est le plus approprié. L' entité format spécifié par le type de support donné dans le Type de Contenu champ d'en-tête. Selon le le format et les capacités de

l'agent de l'utilisateur, la sélection de la plupart des choix approprié PEUT être effectuée automatiquement. Cependant, ce spécification ne définit pas de la norme pour de telles sélection automatique.

Si le serveur dispose d'un choix de prédilection de la représentation, il DOIT inclure l'URI spécifiques pour que la représentation dans le champ de l'Emplacement; les agents utilisateurs PEUVENT utiliser le champ de l'Emplacement de valeur pour la redirection automatique. Cette la réponse est mis en cache, à moins d'indication sinon.

10.3.2 301 Moved Permanently

La ressource demandée a été un nouveau permanente URI et tout des références à cette ressource Utilisez l'un des le retour de l'Uri. Les Clients avec des capacités d'édition de lien devrait automatiquement re-link les références à l'URI de la Requête de l'une des nouvelles références retourné par le serveur, si possible. Cette la réponse est mis en cache, à moins d'indication sinon.

Le nouveau permanente URI DOIT être donné par le champ Emplacement dans la réponse. À moins que la méthode de la requête a été à la TÊTE, l'entité de la réponse DOIT contient une courte hypertexte note avec une lien hypertexte vers la nouvelle URI(s).

Si l'301 code d'état est reçu dans réponse à une demande autre que de se ou de la TÊTE, l'agent utilisateur ne DOIT PAS rediriger automatiquement la demande sauf s'il peut être confirmé par la l'utilisateur, car cela pourrait modifier l' les conditions selon lesquelles la demande a été délivré.

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302 Found

La ressource demandée réside temporairement sous un autre URI. Depuis la redirection peut être modifiée à l'occasion, le client DOIT continuer à utiliser l'URI de Demande pour les demandes futures. Cette réponse n'est être mise en cache si indiqué par un Cache-Control ou l'Expiration de champ d'en-tête.

Le temporaire URI DOIT être donnée par le champ Emplacement dans la réponse. À moins que la méthode de la requête a été à la TÊTE, l'entité de la réponse DOIT contient une courte hypertexte note avec une lien hypertexte vers la nouvelle URI(s).

Si le code d'état 302 est reçu dans réponse à une demande autre que de se ou de la TÊTE, l'agent utilisateur ne DOIT PAS rediriger automatiquement la demande sauf s'il peut être confirmé par la l'utilisateur, car cela pourrait modifier l' les conditions selon lesquelles la demande a été délivré.

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

ont été un 303 la réponse, en effectuant un OBTENIR sur le champ de valeur quel que soit de l'original de la demande de la méthode. Les codes de statut de 303 et 307 ont été ajoutés pour les serveurs qui souhaitent faire sans ambiguïté qui genre de réaction qui est attendu du client.

10.3.4 303 Voir D'Autres

La réponse à la demande peut être trouvé sous un autre URI et DEVRAIT être récupérées à l'aide d'une méthode GET sur cette ressource. Cette méthode existe principalement pour permettre la sortie d'un POST-script activé pour rediriger l' l'agent utilisateur à une ressource sélectionnée. L' nouvel URI n'est pas un substitut de référence pour l'origine de la demande de ressources. 303 réponse ne DOIT PAS être mis en cache, mais la réponse à la deuxième (redirigé) la demande peut être pouvant être mis en cache.

Les différents URI DOIT être donnée par le champ Emplacement dans la réponse. À moins que la méthode de la requête a été à la TÊTE, l'entité de la réponse DOIT contient une courte hypertexte note avec une lien hypertexte vers la nouvelle URI(s).

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 "304 Not Modified"

Si le client a effectué une conditionnel OBTENIR la demande et l'accès est autorisé, mais le document n'a pas été modifié, le serveur DOIT répondre avec ce code de statut. Le 304 la réponse ne DOIT PAS contenir un message du corps, et est donc toujours résilié par la première ligne vide après les champs d'en-tête.

La réponse DOIT inclure les suite de champs d'en-tête:

  - Date, unless its omission is required by section 14.18.1 If a

clockless serveur d'origine obéit à ces les règles, et les mandataires et les clients, ajoutez leur propre Date pour toute réponse reçu sans (comme déjà spécifié par [RFC 2068], section 14.19), caches fonctionner correctement.

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

section 13.3.3), la réponse DOIT Ne PAS inclure d'autres de l'entité en-têtes. Dans le cas contraire (c'est à dire, la condition d'OBTENIR utilisé une faiblesse du programme de validation), la réponse Ne DOIT PAS inclure d'autres de l'entité en-têtes; cela évite les incohérences entre le cache d'entité-corps et des mises à jour les en-têtes.

Si une réponse 304 indique une entité actuellement pas mis en cache, le cache Ne DOIVENT pas tenir compte de la réponse et de répéter la demande sans le conditionnel.

Si un cache utilise un reçu 304 réponse pour mettre à jour une entrée de cache, le cache DOIT mettre à jour l'entrée de réfléchir toutes les nouvelles valeurs des champs de données dans le réponse.

10.3.6 305 Use Proxy

La ressource demandée DOIT être accessible par le biais de la procuration donnée par le champ Emplacement. Le champ de l'Emplacement de donne l'URI de la procuration. L' le destinataire est prévu de répéter ce simple demande via le formulaire de procuration. 305 les réponses DOIVENT être générées uniquement par les serveurs d'origine.

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306 (Inutilisé)

La 306 code d'état a été utilisé dans un la version précédente de la norme, n'est plus utilisé, et le code est réservés.

10.3.8 307 Temporary Redirect

La ressource demandée réside temporairement sous un autre URI. Depuis la redirection PEUT être modifié à l'occasion, le client DOIT continuer à utiliser l'URI de Demande pour les demandes futures. Cette réponse n'est être mise en cache si indiqué par un Cache-Control ou l'Expiration de champ d'en-tête.

Le temporaire URI DOIT être donnée par le champ Emplacement dans la réponse. À moins que la méthode de la requête a été à la TÊTE, l'entité de la réponse DOIT contient une courte hypertexte note avec une lien hypertexte vers la nouvelle URI(s) , depuis de nombreux pré-HTTP/1.1, les agents utilisateurs ne sont pas comprendre la 307 état. Par conséquent, la note DOIT contenir les les informations nécessaires pour un utilisateur de répétez l'original de la demande sur la nouvelle URI.

Si la 307 code d'état est reçu dans réponse à une demande autre que de se ou de la TÊTE, l'agent utilisateur ne DOIT PAS rediriger automatiquement la demande sauf s'il peut être confirmé par la l'utilisateur, car cela pourrait modifier l' les conditions selon lesquelles la demande a été délivré.

Je suis l'aide de 302 pour l'instant, en attendant que je trouve la bonne réponse.

Mise à jour et conclusion:

HTTP 302 est mieux depuis sa connu pour avoir la meilleure compatibilité avec les navigateurs.

94voto

Pekka 웃 Points 249607

Je dirais 303 voir d'autres 302 Found:

La ressource demandée réside temporairement dans une autre URI. Depuis la redirection peut être modifiée à l'occasion, le client DEVRAIT continuer à utiliser l'URI de Demande pour les demandes futures. Cette réponse n'est mis en cache si elle est indiquée par un Cache-Control ou l'Expiration de champ d'en-tête.

s'adapte à une page de connexion le plus étroitement à mon avis. J'ai d'abord envisagé 303 see other , ce qui fonctionnerait tout aussi bien. Après réflexion, je dirais 302 Found est plus précis, parce que la ressource demandée a été trouvé, il est juste une autre page pour aller de l'avant, il peut être consulté. La réponse n'est pas mise en cache par défaut, ce qui est très bien.

66voto

filip26 Points 623

C'est une mauvaise utilisation de la redirection HTTP mécanisme. Si un utilisateur n'est pas autorisé alors votre application doit retourner 401 non autorisé. Dans le cas où l'utilisateur est autorisé, mais n'ont pas accès à la ressource demandée puis 403 Forbidden doit être retourné.

Vous devriez faire la redirection côté client, par exemple en javascript. code d'état pour la redirection en raison de l'autorisation requise n'existe pas. À l'aide de 30x pour ce qui est toujours une mauvaise utilisation.

12voto

Dave Points 2545

Je pense que la solution la plus appropriée est la HTTP 401 (Non Autorisé) de la tête.

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

Le but de cet en-tête est exactement cela. Mais, au lieu de rediriger vers une page de connexion, le processus correct serait quelque chose comme:

  • L'utilisateur n'est pas connecté essayez d'accéder à une connexion d'accès restreint de la page.
  • le système identifie l'utilisateur n'est pas connecté
  • le système renvoie une erreur HTTP 401-tête, ET d'afficher le formulaire de connexion dans la même réponse (pas de redirection).

C'est une bonne pratique, comme fournir un utile de la page 404, sitemap liens, et un formulaire de recherche par exemple.

Voir vous.

-2voto

mgutt Points 784

J'ai eu de rares cas où le navigateur Firefox cache la redirection 302. C'est la raison pour laquelle je suis à l'aide de 307 pour les pages de connexion et par exemple redirige vers le nouveau article/post/commentaire/etc.

Si vous utilisez 302, n'oubliez pas de vérifier que la mise en cache est désactivée:

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache');
header('Pragma: no-cache');
header('Cache-Control: post-check=0, pre-check=0', false);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X