Si je veux refuser poliment le service sur un site Web en raison d'une surcharge temporaire, la réponse HTTP 503 Service Unavailable semble appropriée. La spécification mentionne l'envoi d'un en-tête Retry-after avec le 503.
Y a-t-il un point? La nouvelle tentative affecte-t-elle quelque chose? Les navigateurs y prêtent-ils attention?
Pour autant que je sache, aucun navigateur ne fait attention à un Retry-after
entête. Les procurations et les caches pourraient, mais
Apparemment, certains navigateurs incluent désormais un certain niveau de support pour Retry-After
(bien que le support soit encore au mieux incertain). Je ne suis pas entièrement convaincu de l'intérêt de le faire dans un navigateur; généralement, il est considéré comme une mauvaise idée de mettre en cache les échecs. Mais si vous savez quand vous accepterez à nouveau les demandes, le client ne pourra pas faire de mal. (Si vous revenez plus tôt que prévu, cependant, tout programme qui respecte réellement l'en-tête doit supposer - et signaler - que le site est toujours en panne.)
L'avantage le plus évident est, il semble que Googlebot (et peut-être d'autres araignées) fera attention à l'en-tête s'il est là, ce qui peut l'empêcher de désindexer la page pendant un certain temps.
Cela dit ... si c'est trivial à ajouter et que vous pouvez arriver à une estimation raisonnablement précise de la date à laquelle le service sera disponible, allez-y. Cependant, je ne recommanderais pas de faire de votre mieux pour le faire. Ce n'est qu'un conseil de toute façon, et mettre le mauvais moment là-dedans pourrait causer plus de problèmes que de ne pas inclure l'en-tête du tout.
L'implémentation de l'en-tête Retry-After dans les clients et les serveurs a quelque peu changé ces dernières années depuis la publication initiale de cette question. J'ai donc pensé fournir une réponse mise à jour.
Tout d'abord, RFC 2616, section 14.37 Réessayer après indique:
Le champ d'en-tête de réponse Réessayer après peut être utilisé avec une réponse 503 (Service non disponible) pour indiquer pendant combien de temps le service ne sera pas disponible pour le client demandeur.
...
Deux exemples de son utilisation sont
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT Retry-After: 120
Dans ce dernier exemple, le retard est de 2 minutes.
Voici les messages de validation, les annonces et la documentation du référentiel de code concernant l'en-tête Retry-After dans divers logiciels.
Une validation de code le 22 novembre 2012 avec le message de journal: Ajout de délais d'expiration de détection et utilisation de l'en-tête HTTP Retry-After .
Une validation de code le 27 mars 2012 avec le message logeage: Implémenter la gestion de 5xxs, X-Weave-Backoff, Retry-After . De plus, il y a trois autres mentions d'en-tête Retry-After dans leur référentiel Mercurial.
Un bogue a été initialement soumis le 6 janvier 2004 avec le titre Retry-After envoyé avec la réponse HTTP 503 est ignoré .
Un article du blog Google Webmaster Central sur le traitement des temps d'arrêt du site mentionne que l'en-tête Réessayer après peut être utilisé pour déterminer quand ré-analyser l'URL .
Impossible de trouver un document de support officiel pour la nouvelle tentative. Cependant, il y avait quelques mentions dans des forums aléatoires sur l'utilisation de cet en-tête dans une réponse 503 pour étrangler les robots de Microsoft.
directive add_header indique:
Ajoute le champ spécifié à un en-tête de réponse à condition que le code de réponse soit égal à 200, 201, 204, 206, 301, 302, 303, 304 ou 307.
Par conséquent, pour ajouter l'en-tête Retry-After pour une réponse 503 à l'aide de la version:
1.7.4 et versions antérieures, utilisez un module tiers, tel que En-têtes Plus .
1.7.5 et versions ultérieures, ajoutez le paramètre always
au add_header
directive.
Contrairement à Nginx, Apache documentation d'en-tête ne donne aucune indication qu'il ne peut pas envoyer d'en-tête Retry-After sur une réponse 503. En ce qui concerne les réponses non 2xx, cependant, les documents indiquent:
ajouter un en-tête à une réponse non réussie (non-2xx) générée localement, telle qu'une redirection, auquel cas seule la table correspondant à toujours est utilisée dans la réponse finale.
Voici un réponse SO qui définit un en-tête Retry-After avec la condition toujours pour 503 réponses, comme le doc le conseille.
Un article AskApache fournit d'autres exemples de configuration sur la façon de demander aux moteurs de recherche de revenir en utilisant une réponse 503 avec un en-tête Retry-After.
J'ai écrit un serveur Ruby qui renvoie simplement une réponse 503 avec un en-tête Retry-After défini sur 10 secondes et un corps contenant un nombre aléatoire.
require 'sinatra'
get '/' do
headers 'Content-Type' => 'text/plain', 'Retry-After' => '10'
status 503
body Rand(1000).to_s
end
Je l'ai accédé sur:
Je m'attendais à ce que ces navigateurs actualisent automatiquement l'URL après 10 secondes et affichent un nouveau nombre aléatoire. Cependant, tous les navigateurs n'ont pas réessayé, même après plusieurs minutes. J'ai également essayé des périodes de réessai plus courtes et plus longues avec les mêmes résultats. Le journal d'accès au serveur a confirmé qu'aucune nouvelle tentative n'a été effectuée à partir de ces navigateurs.
En outre, une actualisation "douce" avant la période de nouvelle tentative a immédiatement récupéré l'URL. Ainsi, l'en-tête Retry-After ne peut pas être utilisé pour limiter les utilisateurs "heureux de rafraîchissement". Je mentionne cela parce que j'ai vu dans certains forums que cet en-tête pouvait être utilisé pour empêcher les utilisateurs impatients de marteler votre site.
En remarque, il semble logique qu'une actualisation "douce" n'ait aucune action avant la période de temporisation, mais une actualisation "dure" ou de contournement du cache ignorerait toute temporisation et récupérerait immédiatement l'URL.
La prise en charge de l'en-tête Retry-After semble toujours un peu sommaire sur les clients et les serveurs. Néanmoins, c'est une bonne idée de définir un délai de relance pour 503 réponses s'il n'est pas difficile à configurer.
Même si Googlebot est le seul client à prendre en charge l'en-tête et à réessayer après la période d'expiration, il peut empêcher la désindexation de vos pages, par opposition à une réponse 404, 500, 502 ou 504.
Je vois cela comme un problème de poulet et d'œufs: aucun navigateur n'implémente actuellement Retry-after car aucun site Web ne le dérange. À mon avis, allez-y et envoyez-le en tant que service aux utilisateurs. Si leur choix de navigateur Web ne le met pas en œuvre, c'est que leur navigateur ne leur donne tout simplement pas d'informations utiles. Tu l'as fait!
Lorsque je cherche à implémenter des normes qui ont plusieurs implémentations concurrentes, j'essaie toujours d'adhérer aux normes et de ne pas prêter attention aux différentes implémentations (à moins que j'essaye spécifiquement d'émuler une implémentation, comme cURLing mais déguiser mes en-têtes pour ressembler à un navigateur Web). Sinon, nous nous retrouvons avec des normes de facto, que si vous vous souvenez des jours de domination IE, vous ne voulez pas!
Si vous souhaitez envoyer un rafraîchissement automatique après X fois, vous pouvez envoyer un
Refresh: 120; url=http://your_url.com
en PHP:
header("Refresh: " .$retry_time."; url=". $url);
Pour actualiser la page actuelle, vous pouvez utiliser $_SERVER["REQUEST_URI"]
pour $ url.
J'ai testé cet en-tête avec succès dans différentes versions d'Opera, Firefox et Internet Explorer.
Cet en-tête fonctionne même pour actualiser le contenu binaire comme les images (mais uniquement lorsqu'il est chargé directement ou dans un cadre - un IMG-Tag ne se rechargera pas).