之前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 | # location精确匹配 |
优先级
location有几种匹配模式,优先级不同,建议网上搜索教程再仔细了解。
2.2. uri结尾补全”/“
需求:访问{域名}/account
,转跳到{域名}/account/
实现:判断是否目录,再rewrite匹配非/结尾的uri进行补全
1 | if (-d $request_filename){ |
2.3. 静态资源访问
需求:{域名}/resources/路径存放静态资源,实际对应目录/usr/share/nginx/html/resources
实现:使用root和alias指定文件路径
1 | # 方法1 |
区别
^~ 是字符常量匹配,填uri前缀字符串,~是正则匹配,填正则表达式。
*错误实现:alias在location使用正则匹配时候不会自动填充地址,需要将匹配出来的变量$1组合成正确路径。如果像下面配置,只会访问/usr/share/nginx/html/resources/目录,如果该目录没有index页面或者启用目录文件列表功能(autoindex),最后返回403错误。
1 | # 匹配只返回目录 |
拓展:也可以通过判断$request_uri,使用代理转发将静态资源的请求转发给专用的资源主机处理,获取相关的静态资源。
1 | location / { |
注意
proxy_pass带uri会报错。
3. 小结
- 很多场景下uri匹配都需要使用正则表达式,正则表达式虽然难但真香。
- Nginx配置还是很灵活的,某一需求其实可以使用不同的方法实现,但有不少细节需要注意。