Opened 17 months ago

Closed 17 months ago

Last modified 17 months ago

#2518 closed defect (duplicate)

if in location with regex capture will reset numeric variable like $1 from captured group but not for named capture group — at Version 2

Reported by: n0099@… Owned by:
Priority: minor Milestone:
Component: nginx-core Version: 1.25.x
Keywords: Cc:
uname -a: Linux azure 5.15.0-67-generic #74-Ubuntu SMP Wed Feb 22 14:14:39 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.25.1
built by gcc 11.2.0 (Ubuntu 11.2.0-19ubuntu1)
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_v3_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -ffile-prefix-map=/data/builder/debuild/nginx-1.25.1/debian/debuild-base/nginx-1.25.1=. -flto=auto -ffat-lto-objects -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Description (last modified by n0099@…)

This works:

location ~ /uploads/(?<filePath>.*)$ {
    if ($http_referer !~ "^https://example.com") {
        return 403;
    }
    more_set_headers  'X-Path: $1' 'X-Path2: $filePath' 'X-Referer: $http_referer';
    try_files $uri altUploads/$filePath ../otherUploads/$filePath =404;
}

and this won't:

location ~ /uploads/(.*)$ {
    if ($http_referer !~ "^https://example.com") {
        return  403;
    }
    more_set_headers  'X-Path: $1' 'X-Referer: $http_referer';
    try_files   $uri altUploads/$1 ../otherUploads/$1 =404;
}

The X-Path header doesn't exist in the response header when requesting the latter one.
If we remove the whole if block both variable and headers will be appeared in the response.

location ~ /uploads/(.*)$ {
    more_set_headers  'X-Path: $1' 'X-Referer: $http_referer';
    try_files   $uri altUploads/$1 ../otherUploads/$1 =404;
}

Change History (2)

comment:1 by Maxim Dounin, 17 months ago

Resolution: duplicate
Status: newclosed

Positional captures as available via the $1..$9 variables are from the last executed regular expression, and the last regular expression is in the if condition in the examples provided. That is, these variables are expected to be empty.

In contrast, named captures are explicitly saved into the relevant variables when a regular expression matches, and remain available unless the same variable is explicitly overwritten.

Closing this as a duplicate of #1285, which is a ticket about improving documentation on captures.

comment:2 by n0099@…, 17 months ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.