location 匹配的规则和优先级。(重点,面试会问,必须理解和掌握)
nginx常用的变量,这个要求掌握
rewrite:重定向功能。有需要掌握,有需要理解的。
location匹配:
正则表达式:
元字符:
. :任意单个字符,包括汉字 \.转义符才表示.
^:起始位置
$:结束位置
*:匹配前面的字符0次或者多次
+:匹配前面的字符一次或者多次。
?:匹配一次或0次
\:转义符
[0-9A-Za-z]:匹配0-9,A-Z,a-z。
[a]:只能匹配a
{n}:连续重复出现几次,不连续不算,只能连续出现
{n,m}:最少出现几次,最多几次
():分组
|:逻辑或
正则表达式:匹配的是文件内容。(命令结果也算)
URI:统一资源标识符。是一种字符串,主要用于标识抽象的或者物理资源
主要匹配:文件 图片 视频等
nginx当中:uri
www.ky30.com/images/1.jpg
location 就是用来匹配uri的:
1、精确匹配:location = / (...)
2、正则匹配:location ~ / (...)
3、一般匹配:location / (...)
=:精确匹配,完全匹配,错一个字都匹配不到,必须完全一致。
^~:匹配普通字符,前缀匹配
~$:结束位置。
~:区分大小写的匹配
~*:不区分大小写的匹配,取的逻辑非,取反
!~:区分大小写的匹配,取得逻辑非,取反
!~*:不区分大小写的取反。
掌握前缀、后缀匹配,精确匹配,不区分大小写匹配即可
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
The “/
” request will match configuration A, the “/index.html
” request will match configuration B, the “/documents/document.html
” request will match configuration C, the “/images/1.gif
” request will match configuration D, and the “/documents/1.jpg
” request will match configuration E.
官网的说明:
www.ky30.con/ www.ky30.com/test www.ky30.com/document www.ky30.com/images/
location越精确,越匹配(优先级越高)
http://www.example.com/gallery/images/cat.png
A)Location /gallery { }
B)Location ~* /. (png|jpg)$ { }
C)Location = /gallery/images { }
D)Location / { }
= /gally/images/cat.png
正确答案是B
越精确,优先级最高
= 精确匹配优先级最高
~ 正则次之
/ 通用的优先级最低
例:
精确匹配
把精确匹配注释掉之后:
完整路径 > 以什么为开头 > 不区分大小写匹配 > 标明路径 > 通用
一旦匹配到之后,不再向下匹配
1、第一个规则:
location = / {}
直接匹配根网站,通过域名访问网站首页是最多的。使用精确匹配,可以加快处理速度。首页访问。(精确匹配)
2、第二个规则
处理静态文件请求,目录匹配
location ^~ /static/ {}(以什么为开头的格式,匹配静态页面)
3、location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {} 匹配图片用的
4、通用规则:
location / {
proxy_pass ; 指定代理,反向代理,转发动态请求。.php.jsp的请求,发到后端
}
location /test/ {
}
$uri: 请求的URI,不包含主机和查询参数。
$request_uri: 请求的URI,包含主机和查询参数。
$args: 查询参数部分,即?后面的内容。
$query_string: 整个查询字符串,包含?。
$host: 请求的主机名。
$http_user_agent: 请求的User-Agent头信息,用于表示请求的客户端浏览器和操作系统。
$http_referer: 请求的Referer头信息,表示当前页面的来源URL。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口号。
$server_addr: 服务器的IP地址。
$server_port: 服务器的端口号。
$request_method: 请求的HTTP方法,如GET、POST、等。
$content_type: 请求的Content-Type头信息,表示请求体的MIME类型。
$content_length: 请求的Content-Length头信息,表示请求体的长度。
$scheme: 请求的协议,通常是http或https。
$request_filename: 请求的文件名,用于指定请求的实际文件路径。
$document_root: 当前请求的根目录。
$server_name: 服务器名称,用于匹配server块的server_name指令。
$remote_addr: 客户端的IP地址。
$remote_port: 客户端的端口号。
$server_addr: 服务器的IP地址。
$server_port: 服务器的端口号。
例:
访问一下,就把客户端和服务端地址下载下来了
打开看一下
如果不想下载下来,就再加一行
这个时候响应的内容就会直接反映在页面中,不会直接下载
再加上显示获取请求的方法:
default_type test/pain;
表示如果没有在其他地方显示设置,content-type的头字段,默认响应为test/explain纯文本格式
text/html: 默认的响应类型,也就是我们说的页面。
text/plain: 纯文本格式,类似于.txt文件
text/css: CSS样式表的类型,.css
text/javascript:java脚本,js。前端文件,也可以理解是java解析的程序文件
x_forwarded_for:用于获取HTTP请求头中的X-Forwarded-For字段的值。
X-Forwarded-For是一个常见的HTTP请求头,通常由代理服务器添加,用于指示原始客户端的IP地址。
proxy_set_header X-Forwarded-For $remote_addr; 这个是传给后端。
X-Real-IP:头部为客户端真实IP地址
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header指令来设置X-Real-IP头部的值为$remote_addr,即客户端的真实IP地址。
这样,Nginx会将客户端的真实IP地址作为X-Real-IP头部的值传递给后端服务器。
原始ip和真实ip地址这两个非常重要,是核心
不提供这两个ip,后端服务器会没有响应。
rewrite使用nginx的全局变量或者是自己设置的变量,结合正则表达式和标志位实现URL的重定向
rewrite的执行顺序:
1、先执行server块当中的rewrite
2、再执行location匹配
3、如果location当中还有rewrite,继续执行。
不停rewrite,会陷入死循环,只能10次,然后报错,报错的状态码:500。
rewrite
rewrite:开始重定向
regex :表示正则匹配规则。
replacement :表示跳转后的内容,你要重定向的内容。
permanent :返回码301,永久重定向
例:
(.*)什么内容,$1就是什么内容
请求一下,看一下效果
访问test,跳转到了ky30的内容
301永久重定向
200表示请求成功
redriect:临时重定向,显示的返回码:302
例:
vim nginx.conf
重启一下服务,访问看一下
返回码变为302了
永久重定向:301,永久性的变更url,搜索引擎会转移它的权重以及排名到新的URL
临时重定向:302,用于短期变更(网站维护,或者升级更新。)搜索引擎是不会转移权重和排名到新的URL
304表示获取的是本地缓存
break:也是重定向,但是不会改变URL,而且只会请求一次。跳出当前匹配,即刻终止。
location / {
rewrite /test/(.*) /ky30/$1 break;
index index.html index.htm;
}
也会跳转,uri没有发生变化,而且只会请求一次。
例:
rewrite:
break:
last:本条负责匹配完成后,继续向下匹配,只要有last,就继续匹配。配置的时候需要注意,防止死循环
last:
location /test1 {
index index.html index.htm;
rewrite /test1/(.*) /test2/$1 last;
}
location /test2 {
index index.html index.htm;
rewrite /test2/(.*) /test1/$1 last;
}
location /break {
rewrite /break/(.*) /test1/$1 break;
rewrite /test1/(.*) /test2/$1 break;
index index.html index.htm;
}
location /last {
rewrite /last/(.*) /test1/$1 last;
rewrite /test1/(.*) /test2/$1 last;
index index.html index.htm;
}
重启一下,看一下日志文件:
"rewrite or internal redirection cycle while processing"是Nginx中的一个错误信息,
它表示在处理请求时发生了重写或内部重定向循环。
写成死循环,一直在匹配location,循环最多可以执行10次,超过后nginx将返回500错误
这个错误通常是由于配置文件中的重写规则导致了一个无限循环。当Nginx进行重写或内部重定向时,如果新的URI再次匹配了原始的重写规则,就会产生循环,并导致错误。
location ~*.(jpg|png)$
rewrite /.gif
总结:从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,
而 location是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
小实验:
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.kgc.com; #域名修改
#charset utf-8;
#access_log /var/log/nginx/kgc.com-access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.kgc.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.benet.com/$1 permanent; #在重定向时,$1表示请求的URL
}
root html;
index index.html index.htm;
}
}
echo "192.168.233.61 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx 把域名添加到hosts里面去
permanent
permanent: 永久性重定向,请求日志中的状态码为301。
实现效果:
访问kgc.com,跳转到了benet
F12看一下
也是请求两次,响应两次
基于ip地址的跳转,用于页面维护,升级。
只有公司 IP :192.168.233.61访问正常。其他都显示维护中
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.kgc.com; #域名修改
charset utf-8;
access_log /var/log/nginx/kgc.com-access.log; #日志修改
#设置是否合法的IP标记
set $rewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "192.168.233.61"){ #当客户端IP为192.168.233.61时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true){ #当变量值为true时,进行重写
rewrite (.+) /error.html; #重写在访问IP后边插入/error.html,例如192.168.233.22/error.html
}
location = /error.html { #一定要用精确匹配
root html; #网页返回html/error.html的内容
index index.html index.htm;
}
location / {
root html;
index index.html index.htm;
}
}
nginx -t 看看语法有没有错
再在html下创建一个error
systemctl restart nginx
只有 IP 为 192.168.233.61 能正常访问,其它地址都是维护页面
systemctl restart nginx.service
验证一下:
只有允许的才能正常访问
其他都是breaking
重点总结:
location = 优先级最高
location ^- /images/ 正则,以什么为开头location -*\.(pglpng)s 不区分大小写,匹配以。jpg或者png结尾的uri第三优先级location /test/ 通用完整路径
location/通用匹配
匹配到了不再向下匹配。优先级根据精确度,location匹配的是uri
rewrite:
标志位:
last
break
permanent
redirect
location /test/
#现在用户访问/ky30/返回ky30的用户信息
root html
html 创建ky30,
location /test1/