Contents
5.9. Nginx location 深入解析¶
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅是通过查找配置文件将客户端
的请求映射到一个location block,而location是Nginx配置的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
默认nginx.conf配置文件中至少存在一个location /,即表示客户端浏览器请求的URL为域名+“/”,如果location /newindex/,则表示客户端浏览器请求的URL为域名+“/newindex/”。 常见location匹配URL的方式如下:
= :字面精确匹配。
^~ :最大前缀匹配。
/: 不带任何前缀。
~:大小写相关的正则匹配。
~*:大小写无关的正则匹配。
@:location内部重定向的变量。
其中location = 、^~、/属于普通字符串匹配,location ~、 ~ * 属于正则表达式匹配,location的优先级与其在nginx.conf配置文件中的先后顺序无关
location = 精确匹配会第一个被处理,如果发现精确匹配,Nginx则停止搜索其他任何location的匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配 还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx 停止搜索其他匹配,否则 nginx 会继续处理其他 location 指令。 最后匹配理带有”“和”*”的指令,如果找到相应的匹配,则 nginx 停止搜索其他匹配;当 没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会 被使用。
eg
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/" 开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location = /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它 location
[ configuration C ]
root /tmp/;
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg 结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C] 处理.
[ configuration D ]
Root /var/www/html/
}
请求 URI 例子:
/ -> 符合 configuration A
/documents/document.html -> 符合 configuration B
/images/1.gif -> 符合 configuration C
/documents/1.jpg ->符合 configuration D
正常的优先级别为: (location =) > (location 完整路径 >) >(location ^~ 路径) >(location ~* 正 正 则 则) >(location 路径)
生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:
#匹配/,优先级最低
location /
{
root /var/www/html/;
expires 60d;
}
#匹配静态页面,由本地解析
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /var/www/html/;
expires 60d;
}
#匹配动态页面,交给后端服务器
location ~ .*\.(jsp|php|cgi|do)$
{
root /var/www/html/;
proxy_pass http://linux_web;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#直接匹配newindex.html,优先级最高
location =/newindex.html
{
root /var/www/newwww/;
expires 60d;
}