Multiple issues in components/prism-nginx.js
See original GitHub issuenginx
shouldn’t inherit anything fromclike
.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 andrtsig_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
asold.txt
; - replace all occurrences of
|
inold.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)+$
innew.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 from0x00
to0x7E
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.
Issue Analytics
- State:
- Created 5 years ago
- Comments:23 (12 by maintainers)
Your solution is perfect!
Damn. There are examples of
; #
and{ #
, but there are no examples ofanything #
. I’m sorry. See the explanation below.I’m not sure. I haven’t found it yet. I use
nginx -t -c /path/to/nginx.conf
to reveal the rules.nginx outputs the following:
Thus, the
# This is not a comment
part in your example is actually a comment.P.S. I hope I don’t bother you too much 😃