web-dev-qa-db-fra.com

Apache: différence entre "Header always set" et "Header set"?

Des questions

  1. Quelle est la différence entre Header always set et Header set dans Apache?
  2. Autrement dit, qu'est-ce que le mot clé always change sur les circonstances dans lesquelles l'en-tête est défini?
  3. Dois-je toujours définir mes en-têtes en utilisant always?
  4. Y a-t-il une raison de ne pas le faire?

Contexte

J'ai vu...

Header always set X-Frame-Options DENY

...aussi bien que...

Header always set Access-Control-Allow-Headers "*"

... et j'entends parfois que la présence du mot clé always garantit que l'en-tête est correctement défini, ou qu'il est simplement préférable d'inclure le mot clé always en général. Cependant, je n'ai jamais trouvé de réponse claire et définitive pour pourquoi c'est le cas.

J'ai déjà vérifié les documents Apache pour mod_headers , qui ne mentionne que brièvement always:

Lorsque votre action est fonction d'un en-tête existant, vous devrez peut-être spécifier une condition de toujours, en fonction de la table interne dans laquelle l'en-tête d'origine a été défini. La table qui correspond à toujours est utilisée pour les réponses aux erreurs générées localement ainsi que pour la réussite réponses. Notez également que la répétition de cette directive avec les deux conditions est logique dans certains scénarios, car il ne s'agit pas toujours d'un sur-ensemble de réussite par rapport aux en-têtes existants:

  • Vous ajoutez 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.
  • Vous modifiez ou supprimez un en-tête généré par un script CGI, auquel cas les scripts CGI sont dans la table correspondant à toujours et non dans la table par défaut.
  • Vous modifiez ou supprimez un en-tête généré par une partie du serveur, mais cet en-tête n'est pas trouvé par la condition de réussite par défaut.

Autant que je sache, cela signifie que Header set always garantit que l'en-tête est défini même sur les pages non 200. Cependant, mes en-têtes HTTP définis avec Header set ont toujours semblé s'appliquer très bien sur mes 404 pages et autres. Suis-je en train de mal comprendre quelque chose ici?

FWIW, j'ai trouvé SO messages comme Quelle est la différence entre "toujours" et "onsuccess" dans la configuration de l'en-tête d'Apache? , mais la seule réponse n'y est pas t vraiment expliquer clairement pour moi.

Merci beaucoup,
Caleb

24
caleb531

Quelle est la différence entre l'en-tête toujours défini et l'en-tête défini dans Apache?

Comme le dit le bit cité dans le manuel, sans "toujours", vos ajouts ne feront que des réponses réussies.

Mais cela inclut également les erreurs de transmission "réussies" via mod_proxy et peut-être d'autres gestionnaires similaires qui agissent à peu près comme des proxys. Qu'est-ce qui génère vos 404 que vous avez trouvés en désaccord avec le manuel? Un 404 sur un fichier local se comporte certainement comme le décrit le bit cité.

Autrement dit, qu'est-ce que le mot-clé always change sur les circonstances dans lesquelles l'en-tête est défini?

L'API d'Apache conserve deux listes associées à chaque demande, les en-têtes et les err_headers. Le premier n'est pas utilisé si le serveur rencontre une erreur lors du traitement de la demande de ce dernier.

Dois-je toujours définir mes en-têtes en utilisant toujours?

Cela dépend de leur signification. Supposons que vous définissiez des en-têtes Cache-Control qui étaient liés à ce que vous attendiez pour une ressource. Supposons maintenant que vous serviez quelque chose comme 400 ou 502. Vous ne voudrez peut-être pas que cela soit mis en cache!

Y a-t-il une raison de ne pas le faire?

Voir au dessus.

-/-

Il y a aussi un peu dans le manuel que vous n'avez pas cité qui explique le proxy ou le CGI d'un code d'erreur mais pas pour celui pour lequel Apache génère une réponse d'erreur pour:

L'argument de condition facultatif détermine contre quelle table interne d'en-têtes de réponses cette directive fonctionnera. Malgré le nom, la valeur par défaut de onsuccess ne limite pas une action aux réponses avec un code d'état 2xx.

Les en-têtes définis dans cette condition sont toujours utilisés lorsque, par exemple, une demande est correctement envoyée par proxy ou générée par CGI, même lorsqu'ils ont généré un code d'état défaillant.

22
covener