summaryrefslogtreecommitdiffhomepage
path: root/src/http/modules (follow)
AgeCommit message (Collapse)AuthorFilesLines
2026-03-24Fixed the "include" directive inside the "geo" block.Eugene Grebenschikov1-1/+6
The "include" directive should be able to include multiple files if given a filename mask. Completes remaining changes introduced in da4ffd8. Closes: https://github.com/nginx/nginx/issues/1165
2026-03-24Dav: destination length validation for COPY and MOVE.Roman Arutyunyan1-13/+26
Previously, when alias was used in a location with Dav COPY or MOVE enabled, and the destination URI was shorter than the alias, integer underflow could happen in ngx_http_map_uri_to_path(), which could result in heap buffer overwrite, followed by a possible segfault. With some implementations of memcpy(), the segfault could be avoided and the overwrite could result in a change of the source or destination file names to be outside of the location root. Reported by Calif.io in collaboration with Claude and Anthropic Research.
2026-03-24Mp4: fixed possible integer overflow on 32-bit platforms.Roman Arutyunyan1-7/+7
Previously, a 32-bit overflow could happen while validating atom entries count. This allowed processing of an invalid atom with entrires beyond its boundaries with reads and writes outside of the allocated mp4 buffer. Reported by Prabhav Srinath (sprabhav7).
2026-03-24Mp4: avoid zero size buffers in output.Roman Arutyunyan1-6/+9
Previously, data validation checks did not cover the cases when the output contained empty buffers. Such buffers are considered illegal and produce "zero size buf in output" alerts. The change rejects the mp4 files which produce such alerts. Also, the change fixes possible buffer overread and overwrite that could happen while processing empty stco and co64 atoms, as reported by Pavel Kohout (Aisle Research) and Tim Becker.
2026-03-24Upstream keepalive: fixed parameter parsing.Roman Arutyunyan1-1/+1
2026-03-24Proxy: enabled HTTP/1.1 by default for upstream connections.Roman Semenov1-33/+3
Updates the proxy module to use HTTP/1.1 as the default protocol when communicating with upstream servers. This change unlocks features such as persistent connections and chunked transfer encoding. Configurations that require HTTP/1.0 can still override the protocol explicitly.
2026-03-24Upstream: enabled keepalive by default for explicit upstreams.Roman Semenov1-63/+67
Keepalive is now automatically enabled in the "local" mode for upstreams defined in configuration files. Cached keepalive connections are no longer shared between different locations referencing the same explicit upstream unless keepalive is explicitly configured without the "local" parameter. To disable keepalive entirely, use keepalive 0; inside the upstream block. To allow sharing cached connections between locations, configure keepalive <max_cached>; without the "local" parameter.
2026-03-24Upstream keepalive: distinguish cached connections by location.Roman Semenov1-1/+22
The new "local" parameter prevents sharing cached keepalive connections between location blocks. Connections are now reused only within the same location.
2026-03-16gRPC: reset buffer chains on upstream reinit.David Carlier1-0/+3
Previously, ctx->out was not cleared in ngx_http_grpc_reinit_request(), which could cause queued HTTP/2 control frames (SETTINGS ACK, PING ACK, WINDOW_UPDATE) to be sent on next upstream. Additionally, ctx->in and ctx->busy needs to be cleared to avoid similar problems with buffered request body fixed in cd12dc4f1.
2026-03-16Proxy: reset pending control frames on HTTP/2 upstream reinit.David Carlier1-0/+1
Previously, ctx->out was not cleared in ngx_http_proxy_v2_reinit_request(), which could cause stale HTTP/2 control frames (SETTINGS ACK, PING ACK, WINDOW_UPDATE) queued for the old upstream connection to be sent to a new upstream connection during a retry.
2026-03-09Sticky: fixed expiration of learned sessions after reload.Aleksei Bavshin1-2/+57
Previously, the expiration timer for learned session was not started until a new session is created. This could lead to the sessions being active past the expiration time.
2026-03-09Sticky: samesite=<strict|lax|none> cookie flags.Vladimir Kokshenev1-1/+89
Adds new options for the "sticky cookie" directive to set samesite=<strict|lax|none> cookie flags.
2026-03-09Sticky: added the "header" parameter in the learn mode.Vladimir Homutov2-15/+77
With this parameter set, sessions are learned after receiving upstream headers.
2026-03-09Sticky: added the "max-age" attribute to cookie.Vladimir Homutov1-4/+6
RFC 6265 defines "Max-Age" cookie attribute in section 5.2.2. If the "expires" option is passed to the "sticky" directive, "max-age" attribute will appear in cookies set by the module with corresponding value in seconds. For the special "max" value of the "expires" option, corresponding "max-age" attribute value will be set to 315360000 seconds (10 years, similar to how its done in headers_filter module for the "Cache-Control" header).
2026-03-09Sticky: added variables support to cookie domain.Vladimir Homutov1-18/+38
2026-03-09Sticky: added "httponly" and "secure" attributes.Vladimir Homutov1-0/+39
The attributes are described in RFC6265, sections 4.1.2.5 and 4.1.2.6 respectively.
2026-03-09Sticky: added the "learn" mode.Vladimir Homutov1-92/+767
In this mode, nginx "learns" which client uses which proxied server by analyzing headers of client requests and proxied server responses. For example, a proxied server may start sessions by issuing the "Set-Cookie" header field to set cookie 'sid' and returning clients will bring the cookie with the same name. The following configuration may be used to handle this case: upstream u1 { server 127.0.0.1:8080; server 127.0.0.1:8081; sticky learn timeout=10m zone=sess:1m create=$upstream_cookie_sid lookup=$cookie_sid; } Co-authored-by: Ruslan Ermilov <ru@nginx.com> Co-authored-by: Maxim Dounin <mdounin@mdounin.ru>
2026-03-09Upstream: added sticky sessions support for upstreams.Vladimir Homutov6-0/+723
Sticky sessions allow to route the same client to the same upstream server. - upstream structures are extended to keep session-related information - existing balancing modules are updated to provide an id of the selected server (SID) in pc->sid, and to select the server, given it's SID. - other balancing modules are allowed to set the pc->hint value to choose the desired peer. The sticky module will not change the hint if it's already set. - the feature is enabled by default and can be disabled with the "--without-http_upstream_sticky" switch of the configure script. The following configuration can be used to enable sticky sessions for supported balancing modules: upstream u1 { server 127.0.0.1:8080; server 127.0.0.1:8081; sticky cookie server_id expires=1h domain=.example.com path=/; } Co-authored-by: Ruslan Ermilov <ru@nginx.com> Co-authored-by: Roman Arutyunyan <arut@nginx.com> Co-authored-by: Maxim Dounin <mdounin@mdounin.ru>
2026-02-23Mp4: validate sync sample values in stss atom.CodeByMoriarty1-13/+25
Per ISO 14496-12 Section 8.6.2, sync sample numbers must be 1-based. A zero-valued stss entry caused ngx_http_mp4_seek_key_frame() to return a key_prefix exceeding the samples consumed in the forward stts pass, which led the backward loop in ngx_http_mp4_crop_stts_data() to walk past the beginning of the stts data buffer. The fix validates each stss entry in ngx_http_mp4_seek_key_frame() and returns an error if a zero sync sample is encountered. The function signature is changed to return ngx_int_t so it can signal errors to the caller.
2026-02-17SCGI: fixed passing CONTENT_LENGTH in unbuffered mode.Sergey Kandaurov1-4/+2
Passing requests to SCGI uses a recalculated size of a request body as per changes made in d60b8d10f (1.3.9) to support CONTENT_LENGTH with chunked body requests. This, however, is not compatible with unbuffered mode introduced later in 7ec559df5 (1.7.11), where such an approach may not always represent complete request body. The fix is to use r->headers_in.content_length_n representing either original Content-Length, if any, or a recalculated value from request body filters, such as chunked body filter. Reported by Mufeed VH.
2026-02-12Improved $cookie_ evaluation.Vadim Zhestikov1-2/+2
In case "Cookie" header is sent by client, multiple cookie pairs were incorrectly split by a semicolon and comma. Now they are split by a semicolon only. For example, next variables will be found for "Cookie: a=b, c=d; e=f": - $cookie_a: "b, c=d" - $cookie_e: "f" Closes #1042 on GitHub.
2026-02-11Proxy: fixed HTTP/2 upstream with caching enabled.Roman Arutyunyan1-2/+5
Previously, when proxy_cache and keepalive were both enabled with an HTTP/2 upstream, the second request for a cached resource could fail with "upstream sent frame for unknown stream" error followed by "cache file contains invalid header". This happened because ctx->id was set to 1 in the case when no upstream connection exists (e.g. cache hit), making the stream id check fail when the cached response contained frames from a different stream. The fix is to set ctx->id to 0 when there is no upstream connection, indicating that no real stream exists, and skip the stream id validation in this case. Also, ctx->id = 1 is now set only for new connections, not in the shared done label. Closes: https://github.com/nginx/nginx/issues/1101
2026-01-29Proxy: fixed sending HTTP/2 buffered request body on next upstream.Sergey Kandaurov1-0/+2
If a buffered request body wasn't fully sent, such as on early upstream response or limited by flow control, unsent buffers could remain in the input or busy chains when switching to the next upstream server. This resulted either in the invalid request sent or a stalled connection. The fix is to reset chains similar to ngx_http_upstream_reinit().
2026-01-21Range filter: reasonable limit on multiple ranges.Sergey Kandaurov1-1/+16
A total response length with multiple ranges can be larger than the source response size due to multipart boundary headers. This change extends max ranges limit imposed in c2c3e3105 (1.1.2) by accounting boundary headers. Notably, this covers suspicious requests with a lot of small ranges that have an increased processing overhead and are susceptible to range based amplification attacks. The limit disables ranges as long as a total response length comes close to the source size, additionally penalizing small size ranges on a large source size where a processing overhead prevails, while leaving a room for more ranges on a small source size, such that it should not affect well-behaving applications. The limit can be altered with the "max_ranges" directive. Closes #988 on GitHub.
2026-01-15Uwsgi: ensure HTTP_HOST is set to the requested target host.Andrew Clayton1-1/+11
Previously, the HTTP_HOST environment variable was constructed from the Host request header field, which doesn't work well with HTTP/2 and HTTP/3 where Host may be supplanted by the ":authority" pseudo-header field per RFC 9110, section 7.2. Also, it might give an incorrect HTTP_HOST value from HTTP/1.x requests given in the absolute form, in which case the Host header must be ignored by the server, per RFC 9112, section 3.2.2. The fix is to redefine the HTTP_HOST default from a protocol-specific value given in the $host variable. This will now use the Host request header field, ":authority" pseudo-header field, or request line target URI depending on request HTTP version. Also the CGI specification (RFC 3875, 4.1.18) notes The server SHOULD set meta-variables specific to the protocol and scheme for the request. Interpretation of protocol-specific variables depends on the protocol version in SERVER_PROTOCOL.
2026-01-15SCGI: ensure HTTP_HOST is set to the requested target host.Andrew Clayton1-1/+11
Previously, the HTTP_HOST environment variable was constructed from the Host request header field, which doesn't work well with HTTP/2 and HTTP/3 where Host may be supplanted by the ":authority" pseudo-header field per RFC 9110, section 7.2. Also, it might give an incorrect HTTP_HOST value from HTTP/1.x requests given in the absolute form, in which case the Host header must be ignored by the server, per RFC 9112, section 3.2.2. The fix is to redefine the HTTP_HOST default from a protocol-specific value given in the $host variable. This will now use the Host request header field, ":authority" pseudo-header field, or request line target URI depending on request HTTP version. Also the CGI specification (RFC 3875, 4.1.18) notes The server SHOULD set meta-variables specific to the protocol and scheme for the request. Interpretation of protocol-specific variables depends on the protocol version in SERVER_PROTOCOL.
2026-01-15FastCGI: ensure HTTP_HOST is set to the requested target host.Andrew Clayton1-1/+11
Previously, the HTTP_HOST environment variable was constructed from the Host request header field, which doesn't work well with HTTP/2 and HTTP/3 where Host may be supplanted by the ":authority" pseudo-header field per RFC 9110, section 7.2. Also, it might give an incorrect HTTP_HOST value from HTTP/1.x requests given in the absolute form, in which case the Host header must be ignored by the server, per RFC 9112, section 3.2.2. The fix is to redefine the HTTP_HOST default from a protocol-specific value given in the $host variable. This will now use the Host request header field, ":authority" pseudo-header field, or request line target URI depending on request HTTP version. Also the CGI specification (RFC 3875, 4.1.18) notes The server SHOULD set meta-variables specific to the protocol and scheme for the request. Interpretation of protocol-specific variables depends on the protocol version in SERVER_PROTOCOL. Closes: https://github.com/nginx/nginx/issues/256 Closes: https://github.com/nginx/nginx/issues/455 Closes: https://github.com/nginx/nginx/issues/912
2025-12-08Proxy: cache support for HTTP/2.Zhidao HONG1-25/+52
2025-12-08Proxy: buffering support for HTTP/2.Zhidao HONG1-0/+142
2025-12-08Proxy: extracted control frame and skip functions for HTTP/2.Zhidao HONG1-192/+150
2025-12-08Proxy: extracted ngx_http_proxy_v2_process_frames() function.Zhidao HONG1-72/+93
2025-12-08Proxy: added HTTP/2 proxy module.Zhidao HONG3-2/+4027
The module allows to use HTTP/2 protocol for proxying. HTTP/2 proxying is enabled by specifying "proxy_http_version 2". Example: server { listen 8000; location / { proxy_http_version 2; proxy_pass https://127.0.0.1:8443; } } server { listen 8443 ssl; http2 on; ssl_certificate certs/example.com.crt; ssl_certificate_key certs/example.com.key; location / { return 200 foo; } }
2025-12-08Proxy: refactored for HTTP/2 support.Roman Arutyunyan2-107/+182
2025-12-06Disabled bare LF in chunked transfer encoding.Sergey Kandaurov1-1/+1
Chunked transfer encoding, since originally introduced in HTTP/1.1 in RFC 2068, is specified to use CRLF as the only line terminator. Although tolerant applications may recognize a single LF, formally this covers the start line and fields, and doesn't apply to chunks. Strict chunked parsing is reaffirmed as intentional in RFC errata ID 7633, notably "because it does not have to retain backwards compatibility with 1.0 parsers". A general RFC 2616 recommendation to tolerate deviations whenever interpreted unambiguously doesn't apply here, because chunked body is used to determine HTTP message framing; a relaxed parsing may cause various security problems due to a broken delimitation. For instance, this is possible when receiving chunked body from intermediates that blindly parse chunk-ext or a trailer section until CRLF, and pass it further without re-coding.
2025-12-01Add basic ECH shared-mode via OpenSSL.sftcd2-0/+22
2025-11-26Proxy: fixed segfault in URI change.Sergey Kandaurov1-3/+4
If request URI was shorter than location prefix, as after replacement with try_files, location length was used to copy the remaining URI part leading to buffer overread. The fix is to replace full request URI in this case. In the following configuration, request "/123" is changed to "/" when sent to backend. location /1234 { try_files /123 =404; proxy_pass http://127.0.0.1:8080/; } Closes #983 on GitHub.
2025-11-10SSL: ngx_ssl_set_client_hello_callback() error handling.Sergey Kandaurov1-1/+3
The function interface is changed to follow a common approach to other functions used to setup SSL_CTX, with an exception of "ngx_conf_t *cf" since it is not bound to nginx configuration. This is required to report and propagate SSL_CTX_set_ex_data() errors, as reminded by Coverity (CID 1668589).
2025-10-28Fixed compilation warnings on Windows after c93a0c48af87.Roman Arutyunyan1-2/+2
2025-10-27OCSP: fixed invalid type for the 'ssl_ocsp' directive.Roman Semenov1-1/+1
2025-10-25Headers filter: inheritance control for add_header and add_trailer.Roman Arutyunyan1-4/+70
The new directives add_header_inherit and add_trailer_inherit allow to alter inheritance rules for the values specified in the add_header and add_trailer directives in a convenient way. The "merge" parameter enables appending the values from the previous level to the current level values. The "off" parameter cancels inheritance of the values from the previous configuration level, similar to add_header "" (2194e75bb). The "on" parameter (default) enables the standard inheritance behaviour, which is to inherit values from the previous level only if there are no directives on the current level. The inheritance rules themselves are inherited in a standard way. Thus, for example, "add_header_inherit merge;" specified at the top level will be inherited in all nested levels recursively unless redefined below.
2025-10-24Geo: the "volatile" parameter.Dmitry Plotnikov1-0/+12
Similar to map's volatile parameter, creates a non-cacheable geo variable.
2025-10-24SSL: $ssl_sigalg, $ssl_client_sigalg.Sergey Kandaurov1-0/+6
Variables contain the IANA name of the signature scheme[1] used to sign the TLS handshake. Variables are only meaningful when using OpenSSL 3.5 and above, with older versions they are empty. Moreover, since this data isn't stored in a serialized session, variables are only available for new sessions. [1] https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml Requested by willmafh.
2025-10-23CONNECT method support for HTTP/1.1.Roman Arutyunyan1-1/+3
The change allows modules to use the CONNECT method with HTTP/1.1 requests. To do so, they need to set the "allow_connect" flag in the core server configuration.
2025-10-08SSL: disabled using certificate compression with OCSP stapling.Sergey Kandaurov1-1/+7
OCSP response in TLSv1.3 is sent in the Certificate message. This is incompatible with pre-compression of the configured certificates.
2025-09-25SNI: using the ClientHello callback.Sergey Kandaurov1-1/+5
The change introduces an SNI based virtual server selection during early ClientHello processing. The callback is available since OpenSSL 1.1.1; for older OpenSSL versions, the previous behaviour is kept. Using the ClientHello callback sets a reasonable processing order for the "server_name" TLS extension. Notably, session resumption decision now happens after applying server configuration chosen by SNI, useful with enabled verification of client certificates, which brings consistency with BoringSSL behaviour. The change supersedes and reverts a fix made in 46b9f5d38 for TLSv1.3 resumed sessions. In addition, since the callback is invoked prior to the protocol version negotiation, this makes it possible to set "ssl_protocols" on a per-virtual server basis. To keep the $ssl_server_name variable working with TLSv1.2 resumed sessions, as previously fixed in fd97b2a80, a limited server name callback is preserved in order to acknowledge the extension. Note that to allow third-party modules to properly chain the call to ngx_ssl_client_hello_callback(), the servername callback function is passed through exdata.
2025-09-18Fixed inaccurate index directive error report.willmafh1-1/+1
2025-08-11Auth basic: fixed file descriptor leak on memory allocation error.Sergey Kandaurov1-1/+2
Found by Coverity (CID 1662016).
2025-08-03SSL: support for compressed server certificates with OpenSSL.Sergey Kandaurov2-0/+19
The ssl_certificate_compression directive allows to send compressed server certificates. In OpenSSL, they are pre-compressed on startup. To simplify configuration, the SSL_OP_NO_TX_CERTIFICATE_COMPRESSION option is automatically cleared if certificates were pre-compressed. SSL_CTX_compress_certs() may return an error in legitimate cases, e.g., when none of compression algorithms is available or if the resulting compressed size is larger than the original one, thus it is silently ignored. Certificate compression is supported in Chrome with brotli only, in Safari with zlib only, and in Firefox with all listed algorithms. It is supported since Ubuntu 24.10, which has OpenSSL with enabled zlib and zstd support. The actual list of algorithms supported in OpenSSL depends on how the library was configured; it can be brotli, zlib, zstd as listed in RFC 8879.
2025-06-23Upstream: fixed reinit request with gRPC and Early Hints.Sergey Kandaurov2-3/+22
The gRPC module context has connection specific state, which can be lost after request reinitialization when it comes to processing early hints. The fix is to do only a portion of u->reinit_request() implementation required after processing early hints, now inlined in modules. Now NGX_HTTP_UPSTREAM_EARLY_HINTS is returned from u->process_header() for early hints. When reading a cached response, this code is mapped to NGX_HTTP_UPSTREAM_INVALID_HEADER to indicate invalid header format.
2025-06-21Use NULL instead of 0 for null pointer constant.Andrew Clayton2-2/+2
There were a few random places where 0 was being used as a null pointer constant. We have a NULL macro for this very purpose, use it. There is also some interest in actually deprecating the use of 0 as a null pointer constant in C. This was found with -Wzero-as-null-pointer-constant which was enabled for C in GCC 15 (not enabled with Wall or Wextra... yet). Link: <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117059>