语法location [=|~|~*|^~] /uri/ {...}
上下文: server
此命令随URL 不同而接受不同的结构. 可以配置使用常规字符串和正则表达式. 若使用正则表达式, 则必须使用~*前缀(选择不区分大小写的匹配) 或~前缀(区分大小写的匹配)
=表示uri以某个常规字符串开头, 理解为匹配url 路径即可. nginx 不对url 做编码, 因此请求为/static/%20%/aa可以被规则^~ /static/ /aa(有空格) 匹配到.~表示区分大小写的正则匹配~*表示不区分大小写的正则匹配!~和!~*分别为区分大小写不匹配 和 不区分大小写不匹配 的正则/通用匹配, 任何请求都会匹配到
多个location 配置的情况下, 匹配顺序为:
先匹配=, 其次匹配^~, 再匹配按文件中顺序的正则匹配, 最后匹配/. 当有匹配成功的时候, 停止匹配, 按当前匹配规则处理请求.
例1:
1 | location = / { |
产生效果如下:
- 访问
/根目录, 如http://localhost/将匹配规则A - 访问
http://localhost/login将匹配规则B;http://localhost/register将匹配规则H - 访问
http://localhost/static/a.html将匹配规则C - 访问
http://localhost/a.png讲匹配规则D 和规则E, 但规则D 顺序优先, 规则E 不起作用 - 访问
http://localhost/static/c.png优先匹配到规则C - 访问
http://localhost/a.PNG将匹配规则E - 访问
http://localhost/a.xhtml不会匹配到规则F 和规则G,http://localhost/a.XHTML不会匹配到规则G - 访问
http://localhost/category/id/1111匹配到规则H, 因为以上规则都不匹配, 这个时候应该是nginx 转发给后端应用服务器, 如FastCGI(php), tomcat(jsp), nginx 作为反向代理服务器存在.
所以实际使用中, 通常有至少三个匹配规则定义, 如下:
1 | # 第一个必选规则 直接匹配网站根, 通过域名访问网站首页比较频繁, 使用这个会加速处理; 这里直接转发给后端应用服务器了, 也可以是一个静态首页 |