NGINX регулярное выражение в конце пути местоположения - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь настроить location таким образом, чтобы суффикс /reset_password/any_text загружал index.html из каталога, указанного в alias. К сожалению, без удачи ...

#   location /reset_password {
#       alias /var/www/grades-ui;
#   }

    location /reset_password/([0-9a-z]*) {
        alias /var/www/grades-ui;
    } 

Закомментированный код прекрасно работает для загрузки точного пути /reset_password, однако моя цель - обслужить /reset_password/any_text_or_number.

Любые идеи, почемумое регулярное выражение не сработает? Или, может быть, я делаю что-то еще совершенно неправильно?

Редактировать: полный файл конфигурации

server {
    listen 443 ssl; # managed by Certbot

    root /var/www/grades-ui;
    server_name www.mygrades.co.uk mygrades.co.uk;

    ssl_certificate /etc/letsencrypt/live/mygrades.co.uk/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mygrades.co.uk/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        index index.html;
        add_header X-debug-message "Location / reached" always;
    }

    location ^~ /reset_password/(.*)[a-z]/ {
        alias /var/www/grades-ui;
        add_header X-debug-message "Location /reset_password/$1 reached" always;
    }

    location ^~ /reset_password {
        alias /var/www/grades-ui;
        add_header X-debug-message "Location /reset_password reached" always;
    }

#    location /reset_password/([0-9a-z]*) {
#       root /var/www/grades-ui;
#       try_files /index.html =404;
#    }
}

server {
    listen 80;

    if ($host = mygrades.co.uk) {
        return 301 $host$request_uri;
    } # managed by Certbot

    server_name www.mygrades.co.uk mygrades.co.uk;

#    return 301 https://$host$request_uri; # managed by Certbot

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вы путаете ваш синтаксис location. Регулярное выражение location вводится с модификаторами ~ или ~*. Модификатор ^~ означает что-то совсем другое. См. этот документ для деталей.

Блок location ^~ /reset_password { ... } уже соответствует любому URI, который начинается с /reset_password, включая /reset_password/foo. Вам не нужно регулярное выражение для соответствия завершающей части URI.

Вы можете использовать директиву alias с регулярным выражением location, но в этом случае alias требует предоставления полного пути. Подробнее см. в этом документе . Например, это должно работать:

location ~* ^/reset_password {
    alias /var/www/grades-ui/index.html;
}

Но решение, которое я бы предложил, это префикс location с директивами root и try_files. См. этот документ для деталей. Например:

location ^~ /reset_password {
    root /var/www/grades-ui;
    try_files /index.html =404;
}
1 голос
/ 07 октября 2019

Строка ^ ~ является модификатором местоположения префикса, который указывает nginx пропускать обработку местоположений регулярного выражения, если местоположение префикса совпадает. Регулярное выражение использует только ~ или ~ *, чтобы игнорировать регистр. Проверьте документацию для более подробной информации.

Тем не менее, если вам не нужно захватывать какие-либо совпадения с шаблонами регулярных выражений, просто выберите простое префиксное местоположение. Регулярные локации дороги, и они мешают естественному потоку nginx. Автор nginx, Игорь Сысоев, объясняет в этом видео .

Хороший способ использовать местоположение регулярных выражений - заключить его в префиксное местоположение. Это изолирует его от остальной части конфигурации и облегчает отладку. Ваш конфиг также будет масштабироваться более плавно. Вот пример:

location /reset_password/ {
    location ~ /reset_password/([0-9a-z]*) {
        # ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...