专栏首页云服务器运维实践Nginx系列教程(7)nginx rewrite配置规则详细说明
原创

Nginx系列教程(7)nginx rewrite配置规则详细说明

Rewite 规则作用

Rewrite规则可以实现对url的重写,以及重定向

作用场景

URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 SEO优化 维护:后台维护、流量转发等 安全

注:nginx官方文档:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

配置语法

Syntax: rewrite regex replacement flag; Default:——

Context:server、location、if

rewrite语法

server {
    rewrite {规则} {定向路径} {重写类型} ;
}

1、规则:可以是字符串或者正则来表示想匹配的目标url

2、定向路径:表示匹配到规则后要定向的路径,如果规则里有正则,则可以使用$index来表示正则里的捕获分组

3、重写类型:

last :相当于Apache里德(L)标记,表示完成rewrite,浏览器地址栏URL地址不变。停止rewrite检测【如果没有匹配到,会继续向下匹配】 break;本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变。停止rewrite检测【如果没有匹配到,则不再向下匹配,直接返回结果404】

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

简单实例

rewrite ^(.*)$ /pages/maintain.html break;

解释说明:

会把所有的请求都重定向到 /pages/maintain.html 页面。

last和break的区别:

  1. 因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了(return 只能返回除301、302之外的code)。
  2. last一般写在server和if中,而break一般使用在location中 3.last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配 4.break和last都能组织继续执行后面的rewrite指令
  3. 在location里一旦返回break则直接生效并停止后续的匹配location
	server {
		location / {
			rewrite /last/ /q.html last;
			rewrite /break/ /q.html break;
		}
		location = /q.html {
			return 400;
		}
	}

访问/last/时重写到/q.html,然后使用新的uri再匹配,正好匹配到locatoin = /q.html然后返回了400;

访问/break时重写到/q.html,由于返回了break,则直接停止了;

常用的正则表达式

案例说明

简单举例说明

server {
    rewrite /last.html /index.html last;
    # 访问 /last.html 的时候,页面内容重写到 /index.html 中

    rewrite /break.html /index.html break;
    # 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配

    rewrite /redirect.html /index.html redirect;
    # 访问 /redirect.html 的时候,页面直接302定向到 /index.html中

    rewrite /permanent.html /index.html permanent;
    # 访问 /permanent.html 的时候,页面直接301定向到 /index.html中

    rewrite ^/html/(.+?).html$ /post/$1.html permanent;
    # 把 /html/*.html => /post/*.html ,301定向

    rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
    # 把 /search/key => /search.html?keyword=key
}

last与break的区别案例

server {
	listen 80 default_server;
	server_name www.zhangbiao.com;
	access_log  /var/log/nginx/log/host.access.log  main;
	root /opt/app/code;
	location ~ ^/break {
		rewrite ^/break /test/ break;
	}
	location ~ ^/last {
		 rewrite ^/last /test/ last;
	}
	location /test/ {
	   default_type application/json;
	   return 200 '{"status":"success"}';
	}
}

访问:http://www.zhangbiao.com/test/

访问:http://www.zhangbiao.com/last/

访问:http://www.zhangbiao.com/break/

<span style="color:#F4511E; background: antiquewhite; ">可以发现访问 last 的时候新建立了一个请求 /test/ ,而访问/break/ 请求的时候 会去 /opt/app/code 下找相应的资源,没找到所以报错。</span>

Rewrite规则_redirect和permanent区别

server {
	listen 80 default_server;
	server_name www.zhangbiao.com;
	access_log  /var/log/nginx/log/host.access.log  main;
	root /opt/app/code;
	location ~ ^/imooc {
		 rewrite ^/imooc http://www.imooc.com/ permanent;
		 #rewrite ^/imooc http://www.imooc.com/ redirect;
	}
}

redirect 表示临时的重定向 ,只要后端服务是开者的。每次访问 /imoc 都会重定向到 http://www.imooc.com

permanent 表示永久重定向,第一次访问成功后,把后端服务关闭后,访问/imoc 仍然会重定向到 http://www.imooc.com

rewrite 规则实战案例

server {
	listen       80;
	server_name  www.zhangbiao.com;
	root   /opt/app/code;
	location / {
		rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
		if ($http_user_agent ~* Chrome) {
			rewrite ^/nginx http://coding.imooc.com/class/121.html redirect;
		}
		if (!-f $request_filename) {
			rewrite ^/(.*)$ http://www.baidu.com/$1 redirect;
		}
		index  index.html index.htm;
	}
	error_page   500 502 503 504 404  /50x.html;
}

访问:http://www.zhangbiao.com/course-11-22-33.html

访问在 /opt/app/code/course/11/22 下存在的资源文件

访问:http://www.zhangbiao.com/course-11-22-5

访问在 /opt/app/code/course/11/22 下不存在的资源文件 

rewrite优先级规则

  • 执行server 块的rewrite 指令。将所有的网站都重定向同一个网站。
  • 执行location匹配。
  • 执行选定的location中的rewrite。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • Nginx系列教程(6)Nginx location 匹配规则详细解说

    Nginx 的 location 实现了对请求的细分处理,有些 URI 返回静态内容,有些分发到后端服务器等,今天来彻底弄懂它的匹配规则

    haikangweishi
  • CentOS 安装 nginx+tomcat+java+mysql运行环境

    本文介绍了CentOS7 64 Java,Tomcat,MySQL,Maven热部署等服务器环境的搭建过程。

    haikangweishi
  • Nginx系列教程(5)如何保障nginx的高可用性(keepalived)

    一个机器可以绑定多个IP,可以在Nginx上使用keepalived绑定一个虚拟IP,当某一台Nginx出现问题,这个虚拟IP就会自动转移到另一台。

    haikangweishi
  • Nginx rewrite配置规则

    2、定向路径:表示匹配到规则后要定向的路径,如果规则里有正则,则可以使用$index来表示正则里的捕获分组

    JouyPub
  • 一次生产事故的优化经历

    老七Linux
  • 当creator遇上protobufjs—叛逆

    我们之前讲过要在Creator原生环境下使用protobufjs,使用伪装者的方式模拟nodejs的fs和path模块可以完美解决问题。 但随着creator1...

    张晓衡
  • 三、1:orm的增删改字段、创建表

            在models.py中,定义一个类,并且继承models.Model

    py3study
  • “会说话”的手!这个手套可以翻译手语,还能通过APP转换语音

    对于现在不少年轻人来说,在手机上观看短视频或在通勤路上收听广播是他们主要的消息来源,但是对于听障人士来说,这也在无形之中阻断了他们获取最新消息的途径。

    大数据文摘
  • 根据crash学习ARM64虚拟地址空间布局

    可以看到出错提示是:Unable to hanle kernel paging requeset at virtual address ffffdfc7be9c...

    DragonKingZhu
  • 服务器上上传一个静态页面,并通过IP地址访问

    接上一节,服务器搭建完成之后,也可以在浏览器访问了,想在自己的服务器上上传一个静态页面html,并通过IP地址访问,说一个简单粗暴的方法,不需要用linux命令...

    祈澈菇凉

扫码关注云+社区

领取腾讯云代金券