nginx rewrite 重写跳转
location 匹配uri
location 匹配的规则和优先级。重点
nginx常用的变量,要求掌握
rewrite:重定向功能。掌握,理解。
local
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.
location匹配原则:越精确,越匹配(优先级越高)
匹配的优先级:
越精确,优先级越高。
=:精确匹配优先级最高
~:正则次之
/:通用的优先级最低
优先级:
location = > location ^~ >location ~* >location /test/ > location /
一旦匹配到了之后,不再向下匹配。
生产中location匹配规则:
1、第一个必选规则:
location =/ {}
直接匹配根网站。通过域名访问网站首页是最多的,使用精确匹配可以加快处理速度。首页。
2、第二个规则:
location ^~ /static/ {}
处理静态文件的请求,目录匹配,任选一个。
3、第三个规则:
location ~* \ .(gif|jpg|png|css)
匹配图片用的
4、第四个规则:
location / {
proxy_pass #指定代理,反向代理,转发动态请求。 .php .jsp的请求,发到后端。
}
location /test/ {
}
rewrite
rewrite:重写,重定向
使用nginx的全局变量或者是自己设置的变量,结合正则表达式和标志位实现url的重定向。
nginx的内置变量:
$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指令。
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头部的值传递给后端服务器。
location / {
root html;
index index.html index.htm;
default_type text/plain;
return 200 "way:$request_method";
}
default_type text/plain; 声明之后,才会在页面中展示。
#表示如果没有在其他地方显示设置:content-type的头字段,默认响应为text/plain;纯文本格式。会以本地的形式展示给你。
text/html:默认的响应类型,也就是我们说的页面
text/plain:纯文本格式,类似于.txt文件
text/css:css样式表的类型,css
text/javascript:java脚本,.js。前端文件,也可以理解是java解析的程序文件。
rewrite执行顺序:
1、执行server块当中的rewrite的指令
2、执行location匹配
3、如果location当中还有rewrite,继续执行
不停的rewrite,就会陷入死循环,只能10次,然后报错,报错的状态码:500
rewrite的语法:
rewrite <regex> <replacement> [flag]
rewrite:开始重定向
regex:正则匹配的规则
replacement:表示跳转后的内容,你要重定向的url
flag:标志位
标志位有四种类型:
永久重定向:301,永久性的变更url,搜索引擎会转移他的权重以及排名到新的url。
临时重定向:302,临时性的变更url,用于短期变更(网站维护,或者升级更新)。搜索引擎是不会转移权重和排名到新的url。
//304 表示读取的是本地缓存,读的统统都是缓存!!!
permanent:永久重定向:返回码301
redirect:临时重定向,显示的返回码:302
break:是重定向,但是不会改变url,而且只会请求一次,跳出当前匹配,即刻终止。
当客户端向web服务器请求/test/时,web服务器内部自动转换到,重定向的url响应内容,无需请求第二次。
last:本条规则,匹配完成后,继续向下匹配,只要有last,就继续匹配。配置的时候需要注意,防止死循环
rewrite or internal redirection cycle while processing #写成死循环,一直在匹配location,10次,返回码500
看你匹配的是哪一个,就会从哪里匹配。
基于域名的跳转
现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,
需要跳转到新域名上,而且后面的参数保持不变。
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
基于ip地址的跳转:页面维护,或者升级。
192.168.233.61能够访问,其他人访问显示维护
今天公司业务新版本上线,要求所有 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的内容
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx
只有 IP 为 192.168.233.61 能正常访问,其它地址都是维护页面
systemctl restart nginx.service
基于目录下所有 php 结尾的文件跳转
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.test.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.test.com-access.log;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.test.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx
访问http://www.test.com/upload/123.php,直接跳转到www.test.com