访问重写rewrite是Nginx HTTP请求处理过程中的一个重要功能,它是以模块的形式存在于代码中的,其功能是对用户请求的URI进行PCRE正则重写,然后返回30×重定向跳转或按条件执行相关配置。rewrite模块内置了类似脚本语言的set、if、break、return配置指令,通过这些指令,用户可以在HTTP请求处理过程中对URI进行更灵活的操作控制。rewrite模块提供的指令可以分两类,一类是标准配置指令,这部分指令只是对指定的操作进行相应的操作控制;另一类是脚本指令,这部分指令可以在HTTP指令域内以类似脚本编程的形式进行编写。
标准配置指令
指令 | 说明 |
---|---|
rewrite_log | 当指令值为on时,rewrite的执行结果会以notice级别记录到Nginx的error日志文件中 |
uninitialized_variable_warn | 指令值为on时,会将未初始化的变量告警记录到日志中 |
rewrite | 对用户的URI用正则表达式的方式进行重写,并跳转到新的URI |
rewrite指令格式
rewrite regex replacement [flag];
参数 | 说明 |
---|---|
regex | PCRE语法格式的正则表达式 |
replacement | 重写URI的改写规则。当改写规则以“http://”“https://”或“$scheme”开头时,Nginx重写该语句后将停止执行后续任务,并将改写后的URI跳转返回客户端。 |
flag | 执行该条重写指令后的操作控制符,操作控制符有如下4种 |
last | 执行完当前重写规则跳转到新的URI后继续执行后续操作 |
break | 执行完当前重写规则跳转到新的URI后不再执行后续操作。不影响用户浏览器URI显示 |
redirect | 返回响应状态码302的临时重定向,返回内容是重定向URI的内容,但浏览器网址仍为请求时的URI |
permanent | 返回响应状态码301的永久重定向,返回内容是重定向URI的内容,浏览器网址变为重定向的URI |
rewrite 示例
1、基于域名的跳转
现在公司旧域名www.kgc.com
有业务需求变更,需要使用新域名代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.gc.com;
charset utf-8;
access_log /var/log/nginx/www.gc.com.access.log;
location / {
if ($host = 'www.gc.com'){
rewrite ^/(.*)$ http://www.qqq.com/$1 permanent;
}
root html;
index index.html index.htm;
}
}
echo "192.168.132.6 www.gc.com www.qqq.com" >> /etc/hosts
mkdir -p /var/log/nginx/
systemctl restart nginx
访问http://www.gc.com/test/1.html
2、基于客户端 IP 访问跳转
要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.10访问正常。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.gc.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.gc.com-access.log; #日志修改
#设置是否合法的IP标记
set $rewrite true; #设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "192.168.190.52"){ #当客户端IP为192.168.190.52时,将变量值设为false,不进行重写
set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true){ #当变量值为true时,进行重写
rewrite (.+) /weihu.html; #将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html
}
location = /weihu.html {
root /var/www/html; #网页返回/var/www/html/weihu.html的内容
}
location / {
root html;
index index.html index.htm;
}
}
mkdir -p /var/www/html/
echo "<h1>正在维护!!!等会再来</h1>" > /var/www/html/weihu.html
systemctl restart nginx
3、基于旧域名跳转到新域名后面加目录
现在访问的是 http://bbs.gc.com/post/,现在需要将这个域名下面的访问都跳转到http://www.gc.com/bbs/post/
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name bbs.gc.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.gc.com-access.log;
#添加
location /post {
rewrite (.+) http://www.gc.com/bbs$1 permanent; #这里的$1为位置变量,代表/post
}
location / {
root html;
index index.html index.htm;
}
}
mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html" >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.190.52 bbs.gc.com www.gc.com" >> /etc/hosts
systemctl restart nginx
4、基于参数匹配的跳转
现在访问http://www.gc.com/100-(100|200)-100)(任意数字).html 跳转到http://www.gc.com页面。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.gc.com;
charset utf-8;
access_log /var/log/nginx/www.gc.com.access.log;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.+) http://www.gc.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx
浏览器访问
http://www.gc.com/100-200-100.html 或
http://www.gc.com/100-100-100.html 跳转到http://www.gc.com页面。
5、基于目录下所有 php 结尾的文件跳转
要求访问 http://www.gc.com/upload/abc.php 跳转到首页。
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.gc.com;
charset utf-8;
access_log /var/log/nginx/www.gc.com.access.log;
location ~* /upload/.*\.php$ {
rewrite (.+) http://www.gc.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx
浏览器访问
http://www.gc.com/upload/abc.php 跳转到http://www.gc.com页面。
6、基于最普通一条 url 请求的跳转
要求访问一个具体的页面如 http://www.gc.com/abc/123.html 跳转到首页
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.gc.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.gc.com-access.log;
location ~* ^/abc/123.html {
rewrite (.+) http://www.gc.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}
systemctl restart nginx
浏览器访问 http://www.gc.com/abc/123.html 跳转到http://www.gc.com页面。
评论区