目录
location
常用的nginx正则表达式
URI
location分类
location常用的匹配规则
location优先级
location实例说明
优先级总结
在实际网站中使用的匹配规则至少有三个匹配规则
rewrite
rewrite执行顺序
nginx的内置变量
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*:匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+:匹配前面的字符一次或者多次。如“ol+”能匹配"ol"及“oll”、"olll",但不能匹配“o”
?:匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,“?”等效于“{0,1}”
.:匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“{.\n}”之类的模式
\:将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用,如“\n”匹配一个换行符,而“\$”则匹配“$”
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
{n,m}:重复n到m次
[]:定义匹配的字符范围
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z0-9]:匹配所有大小写字母或者数字任意一个
():表达式的开始和结束位置
|:或运算符
Uniform Resource Identifier,统一资源标识符)是一种字符串标识符,用于标识抽象或物理资源,
如文件、图片、视频等。
它由多个组件组成,包括协议、主机名、端口号、路径等,例如 http://www.kgc.com:8080/index.html 就是一个 URI。
在 Nginx 中,匹配的对象通常是 URI 的一部分,比如 /index.html、/images/logo.png 等。
1、精准匹配:location = / {...}
2、一般匹配:location / {...}
3、正则匹配: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;
}
(4)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
#不区分大小写
(location = 完整路径)> (location ^~ 完整路径)>(location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
#第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是个静态首页,可以直接转发给后端应用服务器
location = / {
root html;
index index.html index. htm;
}
第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
重定向,rewrite使用nginx全局变量或是自己设置的变量,结合正则表达式和标志位实现URL的重定向
重定向,rewrite使用nginx全局变量或是自己设置的变量,结合正则表达式和标志位实现URL的重定向
1、执行server块当中的rewrite的
2、执行location匹配
3、如果location当中还有rewrite,继续执行。
不停的rewrite会陷入死循环,十次后报错,报错状态码:500
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头部的值传递给后端服务器。
$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指令。
content-type
location / {
root html; index index.html index.htm;
default_type text/plain; return 200 "way:$request_method";
}
default_type text/plain;
表示如果没有在其他地方显示设置: conte
nt-type的头字段,默认响应为text/plain纯文本格式
text/plain默认响应类型,也就是页面
text/plain 纯文本格式,类似于.txt
text/css CSS样式的类型
text/javascript Java脚本,.js 前端文件,也可以理解为Java解析的程序文件
rewrite的语法
rewrite
rewrite 开始重定向
regex 正则匹配的规则
replacement 替换内容,重定向的新url路径
[flag] 标志位
permnaent 永久重定向 返回码301
redirect 临时重定向返回码302
永久重定向 301 会永久性的变更URL,搜索引擎会转移它的权重以及排名到新的URL
临时重定向: 302,用于短期变更(网站维护,或者升级更新)索引擎不会转移它的权重以及排名到新的URL
304 表示获取的是本地缓存
break 是重定向,但不会改变URL,而且只会请求一次,并跳出当前匹配,即刻终止
last 本条规则匹配完成后,继续向下匹配,匹配时要注意防止死循环
rewrite or internal redirection cycle while processing #写成死循环,一直在匹配location,10次,返回码500