web-dev-qa-db-fra.com

Comment enregistrer tous les en-têtes dans nginx?

Selon le titre de cette question, comment dois-je procéder pour enregistrer tous les en-têtes que le navigateur client a envoyés dans Nginx? Je souhaite également enregistrer l'en-tête de réponse. Notez que j'utilise nginx comme proxy inverse.

Après avoir parcouru la documentation, je comprends que je peux enregistrer un en-tête spécifique, mais je veux enregistrer tous les en-têtes.

J'accepterai une solution hacky!

30
gauravphoenix

Après de nombreuses recherches, je peux conclure que ce n'est pas possible hors de la boîte.

Mise à jour - vous pouvez utiliser openresty fourni avec Lua. En utilisant Lua, on peut faire des choses assez cool, y compris la journalisation de tous les en-têtes pour dire, Redis ou un autre serveur

15
gauravphoenix

Comme @gauravphoenix l'a dit, vous avez besoin de l'opportunité qui vient avec Lua. Voir https://github.com/openresty/lua-nginx-module/ pour l'installer. Une fois qu'il fonctionne, ajoutez nginx

header_filter_by_lua_block {
  local h = ngx.req.get_headers()
  for k, v in pairs(h) do
    ngx.log(ngx.ERR, "Got header "..k..": "..v..";")
  end
}

Inspectez votre journal des erreurs.

12
user1778602

Sur la base de la réponse de @ user1778602, set_by_lua peut être utilisé pour définir tous les en-têtes dans une variable à utiliser ultérieurement au format log_format. Ce qui suit définit tous les en-têtes dans la variable "$ request_headers"

set_by_lua $request_headers '
  local h = ngx.req.get_headers()
  local request_headers_all = ""
  for k, v in pairs(h) do
    request_headers_all = request_headers_all .. ""..k..": "..v..";"
  end
  return request_headers_all
';
1
Amadu Bah