1.概述
Nginx server块下的一个指令,每个server块可以包含多个location块。
2.作用
(1)基于Nginx服务器接收到的请求字符串(例如:server_name/usr-string),对除虚拟主机名称(也可以是ip别名)之外的字符串(例如:“/usr-string”)进行匹配,对特定的匹配进行处理;
(2)地址定向、数据缓存和应答控制等功能都是在这部分实现;
(3)许多第三方模块的配置也是在location块中提供功能。
3.语法结构
Location [ = | ~ | ~* | ^~ ] uri{ … }
1)uri变量是待匹配的请求字符串,可以是不包含正则表达的字符串,也可以是包含正则的字符串。为了叙述方便,约定下文中,不含正则表达的uri称为“普通uri”,包含正则表达的uri称为“正则uri”。
2)方括号的部分是可选项,用来改变请求字符串与uri的匹配方式
= 用于标准uri前,要求请求字符串与uri严格匹配。如果已经匹配成功,就停止继续向下搜索并立即处理此请求
~ 用于表示uri包含正则表达式,并且区分大小写
~* 用于表示uri包含正则表达式,并且不区分大小写
^~ 用于普通uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。当浏览器在传送URI时会对一部分字符进行URL编码,比如空格被编码为“%20”,问号被编码为“%3f”等。^~有一个特点就是它会对uri中的这些符号进行编码处理。比如,如果location块收到的URI为/html/%20/data,则当nginx服务器搜索到配置为“^~/html/ /data”的location时,可以匹配成功。
4.规则
“普通uri”和“普通uri”:先是严格匹配,然后是最大前缀匹配。“普通uri”的执行逻辑跟location编辑顺序无关。
“正则uri”和“正则uri”:按照正则uri在匹配文件中的物理顺序(编辑顺序)匹配的,只要匹配到一条“uri”,就不再考虑后面的。
“普通uri”和“正则uri”:选择出“普通uri”的最大前缀匹配结果后,还需要继续搜索“正则uri”;搜索到“正则uri”,那么“正则uri”覆盖“普通uri”,但也可以告诉nginx,匹配到了“普通uri”后,不需要继续匹配“正则uri”,只需要在“普通uri”前面加上“^~”符号或者是“=”;不同点是“^~”依然遵循“最大前缀”匹配规则,然后“=”不是最大匹配,而是必须严格匹配(exact match)、只要遇到“精确匹配exact match”,即使普通location没有带“=”或“^~”前缀,也一样会终止后面的匹配。
/me 和 /me/的区别
1:普通匹配时,前者是文件,后者是目录,精确匹配/me/
2:正则匹配/me/时,/me不匹配,正则匹配/me时,/me/是可以匹配出来的。
注意:(1)正则匹配可以不写root路径,不写的话就是匹配任何路径。
(2)“正则uri”让步于“普通uri”的严格精确匹配结果;但覆盖“普通uri”的最大前缀结果。
5.配置案例
Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在nginx服
务器中,指令root就是用来配置这个根目录的。其语法结构为
Root path; //path为nginx服务器接收到请求以后查找资源的根目录路径
例:配置请求的根目录
Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在nginx服
务器中,指令root就是用来配置这个根目录的,其语法结构为:
Location /zhang/
{
Root /wang;
}
当location块收到“/zhang/index.html”的请求后,将在/wang/zhang/目录下找index.html
响应请求。
例:更改location的uri
在location块中,除了使用root指令请求处理目录,还可以使用alias指令改变location接收
到的URI的请求路径,其语法结构为:
Alias path; //path为修改后的根路径
Location ~ ^/zhang/(.+\.(htm|html))$
{
Alias /yang/other/
}
当location块收到“/zhang/index.html”的请求时,匹配成功。之后根据alias指令的配置,
Nginx服务器将到/yang/other/目录下寻找index.html。可以看到,通过alias的指令,根路径
已经从/zhang到/yang/other了。
例:配置网站的默认首页
指令index用来设置网站的默认首页,他一般可以有两个作用:一是,用户在发出请求访问
网站时,请求地址可以不写首页名称;二是,可以对一个请求,根据其请求内容而设置不同
的首页。该指令的语法结构为:
Index file …..;
File可以包含多个文件名 ,其间使用空格分隔,也可以包含其它变量。此变量默认为
“index.html”。
例:
Location ~ ^/data/(.+)/web/ $
{
Index index.$1.html index.zhang.html index.html
}
当location块接收到“/data/locationtest/web/“时,匹配成功,它首先将预置变量$1置为”
locationtest“,然后在/data/locationtest/web/路径下按照index的配置次序依次寻找index.loca
tiontest/web/路径下按照index的配置次序依次寻找index.locationtest.html页、
index.zhang.html页和index.html页,首先找到哪个页面,就使用哪个页面响应请求。
设置网站的错误页面
如果用户尝试查看网页时遇到问题,服务器会将HTTP错误从网站发送到web浏览器。如果
无法显示页面,web服务器会显示网站发送的实际错误网页或web浏览器内置的友好错误
信息。Nginx服务器支持自定义错误网页的显示内容。可以通过这一功能在网站发生错误时
为用户提供人性化的错误显示页面。
一般来说,HTTP2XX代表请求正常完成,HTTP3XX代表网站重定向,HTTP4XX代表客户端出
现错误,HTTP5XX代表服务器端出现错误。
Nginx服务器设置网站错误页面的指令为error_page,语法结构为:
Error_page code … [=[response]] uri
Code,要处理的HTTP错误代码
Response,可选项,将code指定的错误代码转化为新的错误代码response。
Uri,错误页面的路径或者网站地址。如果设置为路径,则是以nginx服务器安装路径下的
Html目录为根路径的相对路径;如果设置为网址,则nginx服务器会直接访问该网址获取错
误页面,并返回给用户端。
例:
Error_page 404 /404.html
设置nginx服务器使用“nginx安装路径/html/404.html”页面响应404错误。
Error_page 403 http://somewebsite.com/forbidden.html;
设置nginx服务器使用http://somewebsite.com/forbidden.html页面响应403错误。
Error_page 410 =310 /empty.gif
设置nginx服务器产生404的HTTP消息时,使用“nginx安装路径/html/empty.gif”返回给
用户端301消息(“已移动消息”)。
在前面error_page指令的分析中我们看到,变量uri实际上是一个相对于nginx服务器安装
路径的相对路径。如过不想将错误页面放到nginx服务器的安装路径下管理,可以使用另外
一个location指令定向错误页面到新的路径下面。
例:
Error_page 404 /404.html
Location /404.html
{
Root /myserver/errorpages/
}
首先捕获“/404.html”请求,然后将请求定向到新的路径下面即可。
公司案例
原始配置:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
} //配置项目首页,指定路径
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
} //配置5XX错误页面,重新定向
location /media/
{
root /data/static;
expires 30d;
} //配置匹配/media/的location块
location /forum/
{
root /data/static;
} //配置匹配/forum/的location块
location /zhang/
{
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
#proxy_connect_timeout 90;
#proxy_send_timeout 90;
#proxy_read_timeout 90;
#proxy_buffer_size 4k;
#proxy_buffers 4 32k;
#proxy_busy_buffers_size 64k;
#proxy_temp_file_write_size 64k;
} //配置匹配/zhang/的location块,将请求直接丢给后端tomcat。
location ~ .*\.(js|css)?$
{
expires 1h;
} //将所有js|cs文件缓存到浏览器1小时
}
问题:当在浏览器输入http://xx.xx.xx.xx/zhang/imsgTest.jsp,会出现404的错误