星路

追寻那一缕星光,在漆黑夜晚前行

0%

Nginx配置url转发

之前havcs插件配套站点因为功能页面设置在第二层级,如要访问需要直接访问域名/account/,访问域名/account也会报错,着实反人类。最近因为443端口被禁了,为了避免url再加上端口号长到记不住,趁着调整域名的机会优化了地址访问,在此整理一下Nginx配置方法。


1. 环境

  • Ubuntu 18.04 64位
  • Nginx 1.17.3

2. 案例

以下配置均在http{}块里面配置。

2.1. 域名首页跳转

需求:访问{域名}转跳到{域名}/account/

实现:Nginx提供location块以及if语句来对uri判断并进行跳转,有如下三种配置方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# location精确匹配
location = / {
rewrite / account/ permanent;
}

# location正则精确匹配
location ~ ^/$ {
rewrite / account/ permanent;
}

# nginx内置变量正则匹配
if ($request_uri ~ "^/$") {
rewrite / account/ permanent;
}

优先级

location有几种匹配模式,优先级不同,建议网上搜索教程再仔细了解。

2.2. uri结尾补全”/“

需求:访问{域名}/account,转跳到{域名}/account/

实现:判断是否目录,再rewrite匹配非/结尾的uri进行补全

1
2
3
if (-d $request_filename){
rewrite ^/(.*)([^/])$ https://$host/$1$2/ permanent;
}

2.3. 静态资源访问

需求:{域名}/resources/路径存放静态资源,实际对应目录/usr/share/nginx/html/resources

实现:使用root和alias指定文件路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方法1
location ^~ /resources/ {
root /usr/share/nginx/html/;
}

# 方法2
location ^~ /resources/ {
alias /usr/share/nginx/html/resources/;
}

# 方法3
location ~ ^/resources/(.*) {
alias /usr/share/nginx/html/resources/$1;
}

区别

^~ 是字符常量匹配,填uri前缀字符串,~是正则匹配,填正则表达式。

*错误实现:alias在location使用正则匹配时候不会自动填充地址,需要将匹配出来的变量$1组合成正确路径。如果像下面配置,只会访问/usr/share/nginx/html/resources/目录,如果该目录没有index页面或者启用目录文件列表功能(autoindex),最后返回403错误。

1
2
3
4
# 匹配只返回目录
location ~ ^/resources/ {
alias /usr/share/nginx/html/resources/;
}

拓展:也可以通过判断$request_uri,使用代理转发将静态资源的请求转发给专用的资源主机处理,获取相关的静态资源。

1
2
3
4
5
6
7
8
location / {
if ($request_uri ~ "^/resources/([^?]*)") {
set $path $1;
rewrite . /$path break;
proxy_pass http://1.1.1.1; # 资源主机
break;
}
}

注意

proxy_pass带uri会报错。


3. 小结

  • 很多场景下uri匹配都需要使用正则表达式,正则表达式虽然难但真香。
  • Nginx配置还是很灵活的,某一需求其实可以使用不同的方法实现,但有不少细节需要注意。