NGINX正则表达式位于位置路径的末尾

时间:2019-10-06 16:54:04

标签: regex nginx

我正在尝试设置一个location,以使后缀/reset_password/any_textalias中指定的目录中加载index.html。不幸的是,没有运气...

#   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

有什么想法为什么我的正则表达式不起作用? 也许我正在做其他完全错误的事情?

编辑:完整的conf文件

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 个答案:

答案 0 :(得分:1)

^〜字符串是前缀位置修饰符,如果前缀位置匹配,则告诉nginx跳过对正则表达式位置的处理。正则表达式位置仅使用〜或〜*忽略大小写。查看documentation了解更多详细信息。

也就是说,如果您不需要捕获任何正则表达式模式匹配项,只需使用一个简单的前缀位置即可。正则表达式的位置非常昂贵,并且会干扰Nginx的自然流动。 Nginx的作者Igor Sysoev在this video中进行了解释。

使用正则表达式位置的一种好方法是将其包装在前缀位置。这样可以将其与其余配置隔离开来,并使其更易于调试。您的配置也将更平滑地扩展。这是一个示例:

location /reset_password/ {
    location ~ /reset_password/([0-9a-z]*) {
        # ...
    }
}

答案 1 :(得分:1)

您在混淆location语法。 正则表达式 location~~*修饰符一起引入。 ^~修饰符完全意味着其他含义。有关详情,请参见this document

location ^~ /reset_password { ... }块已经与任何以/reset_password开头的URI匹配,包括/reset_password/foo。您不需要正则表达式来匹配URI的尾部。

您可以将alias指令与正则表达式 location一起使用,但是在这种情况下,alias需要提供完整的路径名。有关详情,请参见this document。例如,这应该起作用:

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

但是我建议的解决方案是使用带有locationroot指令的前缀try_files。有关详情,请参见this document。例如:

location ^~ /reset_password {
    root /var/www/grades-ui;
    try_files /index.html =404;
}