Nginx Rewrite
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx Rewrite相关的知识,希望对你有一定的参考价值。
nginx Rewrite
Rewrite基本概述
1.什么是rewrite
Rewrite
即URL
重写, 主要实现url
地址重写, 以及重定向, 就是把传入Web
的请求重定向到其他URL
的过程。
2.Rewrite使用场景
1.URL
地址跳转,例如用户访问bgx.com
将其跳转到xuliangwei.com
, 或者当用户通过http
的方式访问bgx.com
时,将其跳转至https
的方式访问bgx.com
2.URL
伪静态, 将动态页面显示为静态页面方式的一种技术, 便于搜索引擎的录入, 同时减少动态URL
地址对外暴露过多的参数, 提升更高的安全性。
3.搜索引擎SEO
优化依赖于url
路径, 以便支持搜索引擎录入
Rewrite配置语法
Rewrite示例
Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if
在匹配过程中可以引用一些Nginx的全局变量
$document_root 针对当前请求的根路径设置值;
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$request_filename 当前请求的文件路径名(带网站的主目录/code/images/test.jpg)
$request_uri 当前请求的文件路径名(不带网站的主目录/images/test.jpg)
$scheme用的协议,比如http或者https
Rewrite匹配优先级
1.执行server块的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite
例1:用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html
#http://www.bgx.com/abc/1.html ==> http://www.bgx.com/ccc/bbb/2.html
//1.准备真实的访问路径
[[email protected] ~]# mkdir /code/ccc/bbb -p
[[email protected] ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html
//2.Nginx跳转配置
[[email protected] conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /abc {
rewrite (.*) /ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
}
[[email protected] ~]# systemctl restart nginx
例2:用户访问/2018/ccc/bbb/2.html实际上真实访问是/2014/ccc/bbb/2.html
#http://www.bgx.com/2018/ccc/bbb/2.html ==> http://www.bgx.com/2014/ccc/bbb/2.html
//1.准备真实的访问路径
[[email protected] ~]# mkdir /code/2014/ccc/bbb -p
[[email protected] ~]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html
//2.Nginx跳转配置
[[email protected] conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
}
[[email protected] ~]# systemctl restart nginx
例3:用户访问/test目录下任何内容, 实际上真实访问是http://www.xuliangwei.com
location /test {
rewrite (.*) http://www.xuliangwei.com redirect;
}
例4:用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html
//1.准备真实的访问路径
[[email protected] ~]# mkdir /code/course/11/22/33/ -p
[[email protected] ~]# echo "Curl docs.etiantian.org" > /code/course/11/22/33/course_33.html
//2.Nginx跳转配置
[[email protected] conf.d]# cat ccbb.conf
server {
listen 80;
root /code;
index index.html;
location / {
#灵活
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定
#rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
}
[[email protected] ~]# systemctl restart nginx
例5:将http请求,跳转至https
server {
listen 80;
server_name bgx.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
}
server {
listen 443;
server_name bgx.com;
ssl on;
}
Rewrite标记Flag
rewrite
指令根据表达式来重定向URI
, 或者修改字符串。 可以应用于server,location, if
环境下, 每行rewrite
指令最后跟一个flag
标记,支持的flag
标记有如下表格所示:
flag
last 本条规则匹配完成后,继续向下匹配新的location URI规则
break 本条规则匹配完成后,停止匹配,不在匹配后面的规则
redirect 返回302临时重定向, 地址栏会显示跳转后的地址
permanent 返回301永久重定向, 地址栏会显示跳转后的地址
对比flag中break与last
公司目前产品有一个url地址是www.oldboy.com/2017_old随着时间的推移,
公司希望客户通过新的url访问www.oldboy.com/2019_new需要保证浏览器的url地址不发生变化
[[email protected] ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name www.oldboy.com;
root /code;
rewrite_log on;
location ~ ^/2019_new {
rewrite ^/2019_new /2017_old/ break;
}
location ~ ^/2020_new {
rewrite ^/2020_new /2017_old/ last;
}
location ~ ^/2017_old {
root /code;
index index.html;
}
}
#
[[email protected] conf.d]# mkdir /code/2017_old
[[email protected] conf.d]# echo "2017_old" > /code/2017_old/index.html
last
与break
对比总结:
last
1.last进行Rewrite匹配成功, 停止当前这个请求, 并根据rewrite匹配的规则重新向Server发起一个请求。
2.新请求的内容是域名+URL, 对应的地址为www.oldboy.com/2017_old
break
1.break进行Rewrite匹配成功后, 不会像last重新发起请求, 首先查找站点目录下/code/2017_old/默认返回页是否存在, 如不存在则404, 如存在继续往下匹配
2.根据Rewrite匹配的规则, 跳转至www.oldboy.com/2017_old/的URL地址, 匹配成功后则不继续匹配
对比flag
中redirect
与permanent
[[email protected] ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name localhost;
root /soft/code;
location ~ ^/bgx {
rewrite http://kt.xuliangwei.com redirect;
rewrite http://kt.xuliangwei.com permanent;
#return 301 http://kt.xuliangwei.com;
#return 302 http://kt.xuliangwei.com;
}
以上是关于Nginx Rewrite的主要内容,如果未能解决你的问题,请参考以下文章
apache与nginx在移动终端访问是的rewrite配置