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
# location精确匹配
location = / {
rewrite / account/ permanent;
}

1
2
3
4
# location正则精确匹配
location ~ ^/$ {
rewrite / account/ permanent;
}
1
2
3
4
# nginx内置变量正则匹配
if ($request_uri ~ "^/$") {
rewrite / account/ permanent;
}

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

2.2.uri结尾补全/

需求:访问{域名}/account,转跳到{域名}/account/
实现:判断是否目录,再rewrite匹配非/结尾的uri进行补全

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

2.3.静态资源访问

假设:{域名}/resoutces/路径存放静态资源,实际对应目录/usr/share/nginx/html/resoutces
实现:使用root和alias指定文件路径

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

INFO:^~是字符常量匹配,填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;
}
}

INFO:proxy_pass带uri会报错。


3.小结

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