La documentation est une bonne chose, mais la source ultime de vérité est le code source, et il peut même être plus facile de trouver ce que vous cherchez de cette façon. Ou pas - YMMV.
En ngx_http_log_compile_format()
fonction dans http://lxr.nginx.org/source/src/http/modules/ngx_http_log_module.c est la partie qui analyse votre log_format
directive.
1603 if ((ch >= 'A' && ch <= 'Z')
1604 || (ch >= 'a' && ch <= 'z')
1605 || (ch >= '0' && ch <= '9')
1606 || ch == '_')
1607 {
1608 continue;
1609 }
1610
1611 break;
Le nom de la variable dans la directive log_format ne peut contenir que des caractères alphanumériques suivis de '_'.
Mais ce n'est pas tout, car il reste à savoir comment un en-tête contenant un "." est converti en nom de variable.
http://lxr.nginx.org/source/src/http/ngx_http_parse.c effectue l'analyse syntaxique dans ngx_http_parse_header_line()
. Il y a un peu plus à lire que ce que je veux vraiment dire. Il semble que si le code trouve un '.' dans le nom du champ, rien n'est fait au hash du nom du champ. r->invalid_header = 1;
se met en place, mais ce n'est pas return NGX_HTTP_PARSE_INVALID_HEADER;
comme dans d'autres cas. (voir lignes de code 922-982).
Je n'ai pas envie de continuer à explorer le code pour savoir ce que r->invalid_header = 1;
le fait, et cela ne semble pas nécessaire. log_format ... ${http_abcd} ...
pourrait marcher, et si ça ne marche pas, alors je doute que quelque chose marche. J'essaierais juste, et si ça ne marche pas, je suppose que rien ne marchera.