学习大纲:
++++++++++++++++++++++++++++
location的匹配规则和优先级(重点)
nginx常用的变量(掌握)
rewrite:重定向功能。(掌握,理解)
++++++++++++++++++++++++++++
location匹配 (匹配uir):
正则表达式:
常用正在表达式的元字符:
. :表示任意单个字符,包括汉字。
\.:就表示一个.
^:起始位置
$:结束位置
*:匹配前面的字符0次或者多次
+:匹配前面的字符一次或者多次。
?:匹配前面的字符一次或者0次。
\:转义符
[0-9A-Za-z]:匹配0-9,A-Z,a-z
[a]:只能匹配a
{n}:连续重复出现几次
{n,m}:最少出现n次,最多出现m次
[]:定义匹配的字符范围
[a]:匹配单个字符a
():表达式的开始和结束位置
|:逻辑或
正则表达式匹配的是文件内容。
uri是什么?
uri:统一资源标识符,是一种字符串标识,用于标识抽象的或者物理资源(文件 、图片、 视频)。
举例:www.xxx.com/yy/1.png
在nginx中uri匹配的就是:yy/1.png
location三种匹配方式:
精确匹配:location=/{...}
正则匹配:location ~/{...}
一般匹配:location /{...}
location常用匹配规则:
=:精确匹配,完全匹配,缺少或错一个字都不行,必须完全一致。
^~:匹配普通字符,使用前缀匹配。
~:区分大小写的匹配。
~*:不区分大小写的匹配。
~$:以结束位置进行匹配。
!~:区分大小写的匹配,取得是逻辑非,取反。
!~*:不区分大小写的取反
location的匹配原则:越精确,越容易匹配(优先级越高),一旦匹配到后不再向下匹配.
location匹配的优先级:
=:精确匹配优先级最高。
~:正则,其次。
/:通用的优先级最低
location匹配优先级总结:
(location = 完整路径)> (location ^~ 完整路径)>(location ~,~* 正则顺序) > (location /部分起始路径/) > (location /)
location实例说明:
(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/匹配,/abcd不匹配。若 location /abc,
则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)
(3)location ^~ /test {}
匹配任何以 /images/ 开头的地址
location ^~ /test {
root html;
index index.htm index.html;
}
location ^~ /test/abc {
root html;
index index.htm index.html;
}
(4)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
#不区分大小写
location ~* /TEST {
root html;
index index.htm index.html;
location = /1.jpg {
root /data/nginx/static1;
}
location /1.jpg {
root /data/nginx/static2;
}
location ~* \.(gif|jpg|js)$ {
root /data/nginx/static3;
}
生产中的location匹配规则:
1.第一个必选规则:
location =/{} :直接匹配根网站。(因为根据域名直接访问网站是最多的。使用精确匹配,可以加快处理速度。也可以理解为首页)
可以是个静态首页,可以直接转发给后端应用服务器
location = / {
root html;
index index.html index. htm;
}
2.第二个规则:
location ^~ /static/{}:处理静态文件请求,目录匹配。这是nginx作为http服务器的强项。
location ^~ /static/ {
root /webroot/static/;
}
3.location ~*\.(gif|jpg|jpeg)${}:匹配图片用,匹配所有以 gif、jpg或jpeg 结尾的请求
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
4通用匹配规则:
location /{
proxy_pass 指定代理,反向代理,转发动态请求。php.jsp的请求,发到后端服务器。
}
rewrite
rewrite:重写,重定向
rewrite的作用:
rewrite是使用nginx的全局变量或者是自己设置的一个变量,结合正则表达式和标志位实现url的重写以及重定向。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 :http://www.xxx.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。
nginx的内置变量:
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头部的值传递给后端服务器。
rewrite执行顺序:
1.执行server块当中的rewrite的
2.执行location匹配
3.如果location当中还有rewrite,继续执行。不停的rewrite,进入死循环,只能10次,随后报错,状态码:500 错误!
rewrite的语法:
rewrite <regex><replacemnet>[flag]
rewrite:开始重定向
regex:正则匹配的规则
replacemnet:表示跳转后的内容,你要重定向url
flag:标志位:表示 rewrite 支持的 flag 标记。
permanent:永久重定向(返回码:301)
flag标记说明:
break:是重定向,但是不会改变url,而且只会请求一次。跳出当前匹配,即刻终止。
last:本条规则匹配完成之后,继续向下匹配,只要有last,就继续匹配。配置的时候需要注意,防止陷入死循环。
redirect :返回302临时重定向,用于短期变更(网站维护,或者升级更新),浏览器地址会显示跳转后的URL地址。、
304表示获取的是本地缓存
permanent :返回301永久重定向变更url,浏览器地址栏会显示跳转后的URL地址。
permanent:
location / {
rewrite /test/(.*) /my/$1 permanent;
index index.html index.htm;
}
mkdir test
echo test > index.html
mkdir my
echo my > index.html
返回301,永久重定向
redirect:
location / {
rewrite /test/(.*) /my/$1 redirect;
index index.html index.htm;
}
返回302,临时重定向
永久重定向(301)用于永久性的URL变更,搜索引擎会转移权重和排名到新的URL,客户端会记住新的URL。
临时重定向(302)用于短期的URL变更,搜索引擎不会转移权重和排名到新的URL,客户端会继续访问原始URL。
break:
location / {
rewrite /test/(.*) /my/$1 break;
index index.html index.htm;
}
也会跳转,uri没有发生变化,而且只会请求一次。
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中的一个错误信息,它表示在处理请求时发生了重写或内部重定向循环。(这个错误通常是由于配置文件中的重写规则导致了一个无限循环。当Nginx进行重写或内部重定向时,如果新的URI再次匹配了原始的重写规则,就会产生循环,并导致错误。)
last:循环最多可以执行10次,超过后nginx将返回500错误`
总结:从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,
而 location是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。