nginx shouldn’t inherit anything from clike. nginx doesn’t have classes, booleans, operators, etc.;
- Directive shouldn’t be classified as
keyword, because some parameters are keywords too.
Comments
- The current regex fails in the following example.
http {# This must be recognized as a comment
}
- The current regex doesn’t consider single‑quoted strings.
location ~ '/example'# This shouldn’t be recognized as a comment
{}
Directives
Problem statement
Directives list is obsolete and inconsistent. AFAIK, the current list is based largely on a third‑party gist.
Currently Prism supports 339 directives. nginx contains more than 693 directives. Beside that, some directives shown in components/prism-nginx.js are undocumented, removed years ago or not directives at all. See the table below.
| Directive |
Status in nginx |
CONTENT_, DOCUMENT_, etc. |
Unknown |
auth |
Renamed to pop3_auth in 2007 ¹ |
devpoll_changes |
An undocumented directive |
devpoll_events |
An undocumented directive |
epoll_events |
An undocumented directive |
fastcgi_redirect_errors |
Renamed to fastcgi_intercept_errors in 2006 ¹ |
if_not_empty |
A parameter for fastcgi_param and scgi_param |
kqueue_changes |
An undocumented directive |
kqueue_events |
An undocumented directive |
log_format_combined |
Must be log_format combined. combined is a parameter |
more_set_headers |
A part of ngx_headers_more. It is not distributed with nginx ² |
optimize_server_names |
Replaced by server_name_in_redirect in 2008 ¹, removed in 2015 ³ |
post_action |
A dangerous undocumented directive |
proxy |
A parameter ¹ |
proxy_redirect_errors |
Renamed to proxy_intercept_errors in 2006 ¹ |
proxy_upstream_fail_timeout |
Not supported since 2006 ¹ |
proxy_upstream_max_fails |
Not supported since 2006 ¹ |
rtsig_overflow_events |
Removed in 2015 ¹ |
rtsig_overflow_test |
Removed in 2015 ¹ |
rtsig_overflow_threshold |
Removed in 2015 ¹ |
rtsig_signo |
Removed in 2015 ¹ |
satisfy_any |
Replaced by satisfy in 2008 ¹, removed in 2015 ³ |
so_keepalive |
A parameter for listen |
worker_rlimit_sigpending |
Removed in 2015 ⁴ |
xslt_entities |
Misspelled xml_entities? |
¹ https://nginx.org/en/CHANGES.
² https://github.com/openresty/headers-more-nginx-module.
³ https://hg.nginx.org/nginx/rev/2911b7e5491b.
⁴ https://hg.nginx.org/nginx/rev/967594ba7571.
There are many more removed directives. Here they are:
- obsolete
aio directives and rtsig_signo (see http://hg.nginx.org/nginx/rev/adba26ff70b5) were removed in 2015;
limit_zone is removed in 2014;
secure_link_expires is removed in 2010;
open_file_cache_retest is removed in 2007;
fastcgi_upstream_fail_timeout, fastcgi_upstream_max_fails, fastcgi_x_powered_by, memcached_upstream_fail_timeout, memcached_upstream_max_fails, proxy_pass_server, proxy_pass_x_powered_by, restrict_host_names were removed in 2006;
fastcgi_root, fastcgi_set_var, fastcgi_params, default_charset, post_accept_timeout, proxy_add_x_forwarded_for, proxy_pass_unparsed_uri, proxy_preserve_host, proxy_set_x_real_ip, proxy_set_x_url, proxy_x_var, redirect, server_names_hash_threshold, server_names_hash were removed in 2005.
There are many more undocumented directives. These are degradation, degrade, eventport_events, gzip_hash, gzip_no_buffer, gzip_window, http2_pool_size, http2_streams_index_size, postpone_gzipping, ssi_ignore_recycled_buffers, uwsgi_string (see https://forum.nginx.org/read.php?29,277920,277920).
A proposed solution
On the one hand, there is a relatively fast way to update the list:
- save directives list from
components/prism-nginx.js as old.txt;
- replace all occurrences of
| in old.txt with \n;
- sort lines in
old.txt alphabetically;
- save directives list from https://nginx.org/en/docs/dirindex.html as
new.txt;
- remove names of modules from
new.txt: \s+\(\w+\);
- replace
(^[\w]+)(?:\n\1)+$ in new.txt with \1 to remove duplicates;
- find entries to remove:
diff old.txt new.txt | grep '^<' | sed 's/^< *//';
- find entries to add:
diff old.txt new.txt | grep '^>' | sed 's/^> *//'.
On the other hand, the resulting list is gonna be really long (I get 631 entries without third‑party modules).
Maybe it’s better to replace the list with a single regular expression?
Numbers
Is it obligatory to highlight numbers? What about domain2.com, 128k, 192.168.0.1:8000?
Strings
- Add EOLs. No escaping required. Moreover, escaping is impossible.
- Add escape sequences. Only the following escape sequences are available:
\", \', \\, \n, \r, \t. I’ve checked all the other symbols from 0x00 to 0x7E inside both " and '. \xFF, \uFFFF, \u{FFFF} are not supported.
- Add interpolation (
"$example" and "${example}"). As I previously mentioned, the dollar sign ($) can’t be escaped with \, so nginx interprets \$x as a slash (\) and a subsequent $x variable.
Variables
- Variable names can contain digits. Examples are
$geoip_city_country_code3, $geoip_country_code3, $http2, $time_iso8601. See https://nginx.org/en/docs/varindex.html.
- Names of user‑defined variables (
set $name value;) can only consist of digits, uppercase and lowercase English letters and underscores. Position is irrelevant ($0, $_ are OK). /\$\w+/ is the best choice for a regular variable.
- Built‑in variables with an underscore at the end (
$arg_, $cookie_, $http_, $jwt_claim_, $jwt_header_, $sent_http_, $sent_trailer_, $upstream_cookie_, $upstream_http_, $upstream_trailer_) accept a trailing part. This part can contain any character except /[\x00-\x1F\s"';\\{]/. /[;{]/ are only allowed inside strings ("$arg_;", "$arg_{" are OK). Escaping with a slash (\) is useless.
nginxshouldn’t inherit anything fromclike.nginxdoesn’t have classes, booleans, operators, etc.;keyword, because some parameters are keywords too.Comments
Directives
Problem statement
Directives list is obsolete and inconsistent. AFAIK, the current list is based largely on a third‑party gist.
Currently Prism supports 339 directives. nginx contains more than 693 directives. Beside that, some directives shown in
components/prism-nginx.jsare undocumented, removed years ago or not directives at all. See the table below.CONTENT_,DOCUMENT_, etc.authpop3_authin 2007 ¹devpoll_changesdevpoll_eventsepoll_eventsfastcgi_redirect_errorsfastcgi_intercept_errorsin 2006 ¹if_not_emptyfastcgi_paramandscgi_paramkqueue_changeskqueue_eventslog_format_combinedlog_format combined.combinedis a parametermore_set_headersngx_headers_more. It is not distributed with nginx ²optimize_server_namesserver_name_in_redirectin 2008 ¹, removed in 2015 ³post_actionproxyproxy_redirect_errorsproxy_intercept_errorsin 2006 ¹proxy_upstream_fail_timeoutproxy_upstream_max_failsrtsig_overflow_eventsrtsig_overflow_testrtsig_overflow_thresholdrtsig_signosatisfy_anysatisfyin 2008 ¹, removed in 2015 ³so_keepalivelistenworker_rlimit_sigpendingxslt_entitiesxml_entities?¹ https://nginx.org/en/CHANGES.
² https://github.com/openresty/headers-more-nginx-module.
³ https://hg.nginx.org/nginx/rev/2911b7e5491b.
⁴ https://hg.nginx.org/nginx/rev/967594ba7571.
There are many more removed directives. Here they are:
aiodirectives andrtsig_signo(see http://hg.nginx.org/nginx/rev/adba26ff70b5) were removed in 2015;limit_zoneis removed in 2014;secure_link_expiresis removed in 2010;open_file_cache_retestis removed in 2007;fastcgi_upstream_fail_timeout,fastcgi_upstream_max_fails,fastcgi_x_powered_by,memcached_upstream_fail_timeout,memcached_upstream_max_fails,proxy_pass_server,proxy_pass_x_powered_by,restrict_host_nameswere removed in 2006;fastcgi_root,fastcgi_set_var,fastcgi_params,default_charset,post_accept_timeout,proxy_add_x_forwarded_for,proxy_pass_unparsed_uri,proxy_preserve_host,proxy_set_x_real_ip,proxy_set_x_url,proxy_x_var,redirect,server_names_hash_threshold,server_names_hashwere removed in 2005.There are many more undocumented directives. These are
degradation,degrade,eventport_events,gzip_hash,gzip_no_buffer,gzip_window,http2_pool_size,http2_streams_index_size,postpone_gzipping,ssi_ignore_recycled_buffers,uwsgi_string(see https://forum.nginx.org/read.php?29,277920,277920).A proposed solution
On the one hand, there is a relatively fast way to update the list:
components/prism-nginx.jsasold.txt;|inold.txtwith\n;old.txtalphabetically;new.txt;new.txt:\s+\(\w+\);(^[\w]+)(?:\n\1)+$innew.txtwith\1to remove duplicates;diff old.txt new.txt | grep '^<' | sed 's/^< *//';diff old.txt new.txt | grep '^>' | sed 's/^> *//'.On the other hand, the resulting list is gonna be really long (I get 631 entries without third‑party modules).
Maybe it’s better to replace the list with a single regular expression?
Numbers
Is it obligatory to highlight numbers? What about
domain2.com,128k,192.168.0.1:8000?Strings
\",\',\\,\n,\r,\t. I’ve checked all the other symbols from0x00to0x7Einside both"and'.\xFF,\uFFFF,\u{FFFF}are not supported."$example"and"${example}"). As I previously mentioned, the dollar sign ($) can’t be escaped with\, so nginx interprets\$xas a slash (\) and a subsequent$xvariable.Variables
$geoip_city_country_code3,$geoip_country_code3,$http2,$time_iso8601. See https://nginx.org/en/docs/varindex.html.set $name value;) can only consist of digits, uppercase and lowercase English letters and underscores. Position is irrelevant ($0,$_are OK)./\$\w+/is the best choice for a regular variable.$arg_,$cookie_,$http_,$jwt_claim_,$jwt_header_,$sent_http_,$sent_trailer_,$upstream_cookie_,$upstream_http_,$upstream_trailer_) accept a trailing part. This part can contain any character except/[\x00-\x1F\s"';\\{]/./[;{]/are only allowed inside strings ("$arg_;","$arg_{"are OK). Escaping with a slash (\) is useless.