我正在尝试设置一个location
,以使后缀/reset_password/any_text
从alias
中指定的目录中加载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;
}
答案 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;
}
但是我建议的解决方案是使用带有location
和root
指令的前缀try_files
。有关详情,请参见this document。例如:
location ^~ /reset_password {
root /var/www/grades-ui;
try_files /index.html =404;
}