目录
前言
nginx的相关文章:
Linux 部署 Nginx 的完善过程
Nginx的try_files指令详解
nginx 常用配置之 location 匹配规则
一、location
#是注释的意思,配置文件的注释这一行是不生效的。
location /ppp {
#root html;
alias html;
index index.html index.htm;
}
location是匹配的意思,在浏览器中,搜索http://192.168.149.6/ppp/ooo/ttt.html,那该链接的url是/ppp/ooo/ttt.html。因为url中包含/ppp,所以能匹配上location /ppp。
都没匹配到的时候才会走 location /。
1.location匹配规则
精确匹配优先级最高,前缀匹配优先级高于普通前缀匹配。
1)= 绝对匹配
绝对匹配,即精确匹配,一个字符也不能差,优先级最高,工作中用的少。
location = /abc {
return 900;
}
“return”是返回状态码的意思。
“curl”模拟浏览器访问,-i会返回状态码。
- 验证过程:
127.0.0.1=localhost 本机
2)^~ 前缀匹配
前缀匹配最长优先。
location ^~ /bcd {
return 909;
}
错误用法:“^~ /mnt/”:这样就写死了,达不到前缀匹配的效果
- 注意事项:
一般情况下,正则匹配不可以和alias一起用,否则会出现301重定向的报错,重新跳转另外一个页面。
参考文章:nginx重定向循环、Nginx location + 正则表达式出现301错误
不正常的配置:
location ~* /Lii {
#location ~* /Lii/(.*)$ {
alias /opt/Lii/;
#alias /opt/Lii/$1;
index index.html index.htm;
}
比对报错与网页的搜索结果,找到问题的原因:
报错的原因是:
修改方法:
location ~* /Lii/(.*)$ {
alias /opt/Lii/$1;
index index.html index.htm;
}
location ~* /Lii/(.*html)$ {
alias /opt/Lii/$1;
index index.html index.htm;
}
1、()里面的才是正则表达式。“.” 任意单个字符,“*” 匹配0次或多次,“.*” 匹配任意字符串。
2、“.*\.html===以.html结尾了”,“.” 正则有单个字符的意思。如果没加\,会被认为是单个字符匹配。所以加\,即转义,可以让他只是一个 “.” 的字符的意思。
3)普通匹配
location /abc {
return 909;
}
普通匹配和前缀匹配的匹配方式是一样,^~ 的优先级更高,即前缀匹配优先级更高。
4)~(区分大小写), ~*(不区分大小写) 正则匹配
location ~ /ccb {
return 778;
}
location ~ /CCB {
return 798;
}
location ~* /asw {
return 888;
}
2.alias和root的区别
location /ppp {
alias html;
index index.html index.htm;
}
1、url为/ppp/ooo/ttt.html,alias的会找/usr/local/nginx/html/ooo/ttt.html。
2、“alias html;”中使用了相对路径 html ,所以是在 nginx 的安装路径下,即 /usr/local/nginx/,去找html。
3、/usr/local/nginx/html//ooo/ttt.html===/usr/local/nginx/html/ooo/ttt.html
location /ppp {
root html/;
index index.html index.htm;
}
alias和root的区别:
1、alias 只能作用在 location 中,而 root 可以存在server、http 和 location 中。
2、alias 后面必须要用 “/” 结束,否则会找不到文件,而 root 则对 ”/” 可有可无。
3、alias 是不拼接location内容。
3.index
location /mall {
alias /mnt/mall;
index mall.html mall.htm;
}
首页文件的名字可以修改。
搜索链接为http://192.168.149.6/mall,匹配到 /mall ,所以查找路径为 /mnt/mall 。“alias /mnt/mall;”中设置的是绝对路径,所以不用考虑 nginx 的安装路径。
因为链接最后是目录 mall,所以默认查找 /mnt/mall 下的 mall.html。
4.tryfiles
location /pngs/ {
root /data/user/;
index mall.html mall.htm;
try_files $uri $uri/ /pngs/1.html;
}
查找规则:
1、把浏览器的访问url当做网页文件去找
2、 把浏览器的访问url当目录,去找/data/user/pngs/url下的mall.html
3、前面2个都没找到,就找最后一个url
在浏览器访问http://192.168.149.6/pngs/uuu.html的查找顺序:
- 找/data/user/pngs/uuu.html
- 如果没有uuu.html这个文件,就找url/,即/data/user/pngs/uuu.html目录下的mall.html
只要有uuu.html目录,就会一直在第二步,一直走第二步的规则,不会到第3步。
- 如果没有那个目录才会走第三步:http://192.168.149.6/pngs/1.html,然后又匹配到 /pngs/ ,查找/data/user/pngs/1.html
二、server
一个server对应一个端口,对应一个网站域名。
1.log
1)如何查找报错日志的路径:
[root@test1 conf]# grep -i log nginx.conf
2)log配置的摆放位置
log配置放在server里面,那就对server里的每一个location生效了。
一般写在server里面,或者写http里面server以外。
3)log_format
test1是日志文件格式的别名,这2个是一对的。
192.168.149.1 - - [22/Dec/2023:18:07:06 +0800] "GET /package/test/ HTTP/1.1" 200 290 "http://192.168.149.6/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
192.168.149.1 - - [23/Dec/2023:03:15:54 +0800] "GET /contact/contact.html HTTP/1.1" 304 0 "http://192.168.149.6/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
log_format指定日志文件的格式:
1、$remote_addr,指客户端的ip地址。
2、[$time_local],[23/Dec/2023:14:23:43 +0800]。
3、$request,记录了客户端访问的url。
请求方式:
1、GET代表请求方法。(重点)
2、POST需要提交数据到后台或者数据库,就用post方法。对已有的资源修改也可能使用post方法。(重点)
3、put方法,也会传输数据,从客户端向服务器传送的数据,取代指定的文档内容。(重点)
4、delete方法请求服务器删除指定的页面。(重点)
5、head方法获取报头、信息、数据报文。
6、options方法允许客户端查看服务器性能。
2.报错类型——状态码
-
location匹配到了,去找index首页文件,没找到就报403。
-
一般页面文件找不到,报404。
-
400是异常的,包括404、403、405、408、413、415。405和408是指客户端网络异常。
-
网络是通的,调用接口是通的,状态码就是200,都是正常的。
-
300是重定向,一般也是正常的。
-
500是服务器内部错误,包括502、503、504,一般是后端服务挂了,或者说后端服务没起来。