## Location介绍 location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。 ## location指令语法 location \[=|~|~\*|^~|@\] /uri/ { … } 或 location @name { … } #### 规则说明: | 符号 | 含义 | | --- | --- | | \= | 字面精准匹配,如果匹配,则跳出匹配过程(不再进行正则匹配) | | ~ | 开头区分大小写的正则匹配 | | ~\* | 开头不区分大小写的正则匹配 | | ^~ | 开头表示uri以某个常规字符串开头,理解为匹配url路径即可 | | / | 通用匹配,在没有正则表达式匹配时,任何请求都会匹配到 | | @ | 不是普通的location匹配,用于location内部重定向的变量 | #### 多个location配置的匹配顺序: * 首先匹配:"=" * 其次匹配:"^~" * 再匹配:文件location**书写顺序** * 若没有匹配到,最后把所有请求交给通配符("/") * 当有匹配成功时候,停止匹配,按当前匹配规则处理请求 > 当nginx收到一个请求后,会截取请求的URI部份,去搜索所有location指令中定义的URI匹配模式。 > 在server模块中可以定义多个location指令来匹配不同的url请求,多个不同location配置的URI匹配模式, > 总体的匹配原则是:先匹配普通字符串模式,再匹配正则模式。 > 只识别URI部份 ## location配置实例解析 ~~~ location = / { #规则A } location = /login { #规则B } location ^~ /static/ { #规则C } location ~ \.(gif|jpg|png|js|css)$ { #规则D } location ~* \.png$ { #规则E } location / { #规则F } ~~~ > 访问 http://localhost/ > 将匹配规则 A > 访问 http://localhost/login > 将匹配规则 B > 访问http://localhost/register > 匹配规则 F > 访问 http://localhost/static/a.html > 将匹配规则 C > 访问 http://localhost/a.gif, http://localhost/b.jpg > 将匹配规则 D和规则 E, > 但是**规则 D 顺序优先**,规则 E不起作用 >访问 http://localhost/static/c.png >满足条件的有规则C,D,E >但由于~^/static/优先级高,故匹配规则C > 访问 http://localhost/a.PNG > 则匹配规则 E,而不会匹配规则 D, > 因为规则 E 不区分大小写 > 访问 http://localhost/category/id/1111 > 则最终匹配到规则 F,因为以上规则都不匹配 ##Location常用场景 实际使用中,至少有三个匹配规则定义,如下: **1.第一个必选规则:直接匹配网站根** 通过域名访问网站首页比较频繁,使用这个会加速处理 这里是直接转发给后端应用服务器了,也可以是一个静态首页 ``` 第一个必选规则 location = / { proxy_pass http://locolhost/index } ``` **第二个必选规则:处理静态文件请求** > 这是 nginx 作为 http 服务器的强项 > 处理静态文件请求,有两种配置模式, > 目录匹配或后缀匹配, > 任选其一或搭配使用 ``` location ^~ /static/ { root /webroot/static/; } location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; } ``` **第三个规则:通用规则** 用来转发动态请求到后端应用服务器 非静态文件请求就默认是动态请求,自己根据实际把握 ``` location / { proxy_pass http://localhost/ } ``` ## # 禁止访问.sh后缀的文件实例 ~~~bash server{ ......其他配置 location ~.*\.(sh)${ return 405; } } ~~~ 表示当访问 "\*.sh"的文件就会返回405错误 ## location+nginx反向代理(proxy_pass )实现动静分离 [nginx实现动静分离](https://www.cnblogs.com/zyxnhr/p/10707932.html)