Nginx: имеет значение, размещаются ли регулярные выражения до или после префиксов?

Имеет ли значение, размещаете ли вы регулярные выражения до или после префиксов?

Рассмотрим эту конфигурацию:

server {
    listen 80 default_server;

    server_name www.example.com;

    root /var/www/nginx/example.com/public_html;
    index index.php index.html index.htm;

    location ~ /\.well-known { allow all; }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; allow all; 
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ ^.+\.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; }

    location ~ /\. { access_log off; log_not_found off; deny all; }
}

по сравнению с этой:

server {
    listen 80 default_server;

    server_name www.example.com;

    root /var/www/nginx/example.com/public_html;
    index index.php index.html index.htm;

    location ~ /\.well-known { allow all; }

    location ~ ^.+\.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; }

    location ~ /\. { access_log off; log_not_found off; deny all; }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt { access_log off; log_not_found off; allow all; }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}

Обратите внимание, что хотя я сгруппировал регулярные выражения вместе и теперь они появляются вверху, регулярные выражения по-прежнему следуют в том же последовательном порядке. Будут ли эти две конфигурации вести себя одинаково?

0
задан 23 January 2018 в 19:06
1 ответ

Это то, что говорится в документации о порядке совпадения:

Чтобы найти местоположение, совпадающее с заданным запросом, nginx сначала проверяет местоположения, определенные с помощью префиксных строк (префиксных местоположений). Среди них выбирается и запоминается местоположение с самым длинным совпадающим префиксом. Затем проверяются регулярные выражения в порядке их появления в конфигурационном файле. Поиск регулярных выражений завершается при первом совпадении и используется соответствующая конфигурация. Если совпадение с регулярным выражением не найдено, то используется конфигурация ранее запомненной локации префикса.


Если самая длинная локация префикса совпадения имеет модификатор "^~", то регулярные выражения не проверяются.


Также, используя модификатор "=" можно определить точное совпадение URI и локации. Если точное совпадение найдено, поиск завершается.

https://nginx.org/en/docs/http/ngx_http_core_module.html#location

0
ответ дан 5 December 2019 в 06:45

Теги

Похожие вопросы