Nginx中rewrite(地址重定向)的深入剖析

目录
  • 一、rewrite语法
  • 二、应用场景
  • 三、rewrite指定工作原理
  • 四、flag 参数简介
    • 1、last
    • 2、break
    • 3、redirect
    • 4、parmanent
  • 五、示例
  • 总结

一、rewrite语法

指令语法:rewrite regex replacement[flag]

默认值:none

应用位置:server、location、if

regex是PCRE 风格的,如果regex匹配URI,那么URI就会被替换成replacement,replacement 就是新的URI。如果rewrite同一个上下文中有多个这样的正则,匹配会依照rewrite指令出现的顺序先后依次进行下去,匹配到一个之后并不会终止,而是继续往下匹配,直到返回最后一个匹配上的为止。如果想要中止继续往下匹配,可以使用第三个参数flag。

如果新URI字符中有关于协议的任何东西,比如http://或者https://等,进一步的处理就终止了,直接返回客户端302。

如果返回的是30x,那么浏览器根据这个状态码和Location响应头再发起一次请求,然后才能得到想要的响应结果。但是,如果不是返回30x状态码,那么跳转就是内部的,浏览器不做跳转就能得到相应。

rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记

示例:

rewrite ^/(.*) http://www.baidu.com/ permanent;     # 匹配成功后跳转到百度,执行永久301跳转

常用正则表达式:

字符 描述
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
匹配前面的字符零次或一次
. 匹配除“\n”之外的所有单个字符
(pattern) 匹配括号内的pattern

rewrite的最后一项参数

标记符号 说明
last 本条规则匹配完成后继续向下匹配新的location URL 规则
break 本条规则匹配完成后终止,不在匹配任何规则
redirect 返回302临时重定向
parmanent 返回301永久重定向

二、应用场景

  • 调整用户浏览的URL,看起来规范
  • 为了让搜索引擎收录网站内容,让用户体验更好
  • 网站更换新域名后
  • 根据特殊的变量、目录、客户端进行跳转

三、rewrite指定工作原理

rewrite模块的指令有break, if, return, rewrite, set等。rewrite指令所执行的顺序如下:

首先在server上下文中依照顺序执行rewrite模块指令;如果server中进行了rewrite重新,那么以新的URL发起内部跳转,直接匹配location,不会再执行server中的rewrite指令,然后

- 新URL直接匹配location

- 如果匹配上某个location,那么其中的rewrite模块指令同样依照顺序执行。

- 如果再次导致URL的rewrite,那么再一次进行内部跳转去匹配location,但跳转的总次数不能超过10次。

四、flag 参数简介

1、last

如果有last参数,那么停止处理任何rewrite相关的指令,立即用替换后的新URI开始下一轮的location匹配。

如果在location的rewrite也使用last,便会再次以新的URI重新发起内部重定向,再次进行location匹配,而新的URI中极有可能和旧的URI一样再次匹配到相同location中,这样死循环发生了。当循环到第10次时,Nginx会终止这样无意义的循环,并返回500错误。这点需要特别的注意。

2、break

停止处理任何rewrite的相关指令,就如同break 指令本身一样。

last的break的相同点在于,立即停止执行所有当前上下文的rewrite模块指令;不同点在于last参数接着用新的URI马上搜寻新的location,而break不会搜寻新的location,直接用这个新的URI来处理请求,这样能避免重复rewite。因此,在server上下文中使用last,而在location上下文中使用break

3、redirect

replacement 如果不包含协议,仍然是一个新的的URI,那么就用新的URI匹配的location去处理请求,不会返回30x跳转。但是redirect参数可以让这种情况也返回30x(默认302)状态码,就像新的URI包含http://和https://等一样。这样的话,浏览器看到302,就会再发起一次请求,真正返回响应结果的就是这第二个请求。

4、parmanent

和redirect参数一样,只不过直接返回301永久重定向

虽说URI有了新的,但是要拼接成完整的URL还需要当前请求的scheme,以及由server_name_in_redirect和port_in_redirect指令决定的HOST和PORT.

还有一个比较有意思的应用,就是如果replacement中包含请求参数,那么默认情况下旧URI中的请求参数也会拼接在replacement后面作为新的URI,如果不想这么做,可以在replacement的最后面加上?。

举例说明:

rewrite ^/users/(.*)$ /show?user=$1? last;

这样的新URI还是 /show?user=xxx

但如果不加问号:

rewrite ^/users/(.*)$ /show?user=$1 last;

得到的新URI就是/show?user=$1&xxx=xxx。其中xxx=xxx是旧URI所带的请求参数。

五、示例

server {
  # 访问 /last.html 的时候,页面内容重写到 /index.html 中,并继续后面的location匹配,浏览器地址栏URL地址不变
  rewrite /last.html /index.html last;

  # 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配,浏览器地址栏URL地址不变;
  rewrite /break.html /index.html break;

  # 访问 /redirect.html 的时候,页面直接302定向到 /index.html中,浏览器地址URL跳为index.html
  rewrite /redirect.html /index.html redirect;

  # 访问 /permanent.html 的时候,页面直接301定向到 /index.html中,浏览器地址URL跳为index.html
  rewrite /permanent.html /index.html permanent;

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

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

  # 把当前域名的请求,跳转到新域名上,域名变化但路径不变
  rewrite ^/(.*) http://www.jd.com/$1 permanent;
  }

总结

到此这篇关于Nginx中rewrite(地址重定向)的文章就介绍到这了,更多相关Nginx rewrite地址重定向内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx的rewrite模块详解

    rewrite模块即ngx_http_rewrite_module模块,主要功能是改写请求URI,是Nginx默认安装的模块.rewrite模块会根据PCRE正则匹配重写URI,然后发起内部跳转再匹配location,或者直接做30x重定向返回客户端. 指令执行顺序 首先顺序执行server块中的rewrite模块指令,得到rewrite后的请求URI 然后循环执行如下指令 如果没有遇到中断循环标志,此循环最多执行10次,但是我们可以使用break指令来中断rewrite后的新一轮的循环 (1)

  • 详解nginx中location、rewrite用法总结

    一.location用法总结 location可以把不同方式的请求,定位到不同的处理方式上. 1.location的用法 location ~* /js/.*/\.js 以 = 开头,表示精确匹配:如只匹配根目录结尾的请求,后面不能带任何字符串. 以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配 以~ 开头,表示区分大小写的正则匹配; 以~* 开头,表示不区分大小写的正则匹配 以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到 location的匹配顺序是"先匹配正则,再匹配

  • nginx地址重定向的方法

    1.假设要把webroot/static/index.html访问重定向到static/index.html 例如当我们通过浏览器访问http://192.168.11.210/webroot/static/index.html,实际访问的是web目录下面的static/index.html文件,也及去掉了webroot这个目录,使用alias location ^~ /webroot/ { alias /data/www/web/WebContent/; } 注意: 1. 使用alias时,目

  • nginx rewrite功能使用场景分析

    目录 前言 rewrite简介 Rewrite规则与指令 set指令 if指令 return指令 rewrite指令 URL和URI的区别 rewrite_log指令 一.rewrite配置域名跳转 1.准备两个域名 2.配置nginx.conf文件 二.rewrite配置独立域名 三.rewrite配置目录合并 前言 大家在浏览某些网站的时候,有没有发现,当输入:www.abc.com或者www.abcd.com的时候,页面均能正常显示www.abc.com的主页内容.这就是nginx rew

  • nginx Rewrite重写地址的实现

    目录 一.Nginx正则表达式 二.location 2.1.location大致可以分为三类 2.2. location 常用的匹配规则 2.3. location优先级 2.4.location示例说明 2.5.location 匹配 2.6.实际网站使用中,至少有三个匹配规则定义 三.rewrite 3.1.rewrite跳转实现 3.2.rewrite执行顺序 3.3.语法格式 3.4.flag标记说明 四.rewrite 示例 4.1.基于域名的跳转 4.2.基于客户端 IP 访问跳转

  • nginx rewrite 实现URL跳转的方法

    最近工作中常常要改nginx配置,学习了nginx中rewrite的用法 URL跳转 这里说的URL跳转就是用户在访问一个URL时将其跳转到另一个URL上. 常见的应用场景是让多个域名跳转到同一个URL上,(例如让旧域名跳转到新域名上) 将静态文件请求跳转到cdn上等 根据用户设备跳转到不同站点(pc版,wap版)等. URL跳转可以通过js在页面上设置的window.location实现 也可以通过php设置header来实现 当然也可以用nginx 的 rewrite功能实现 nginx r

  • nginx里的rewrite跳转的实现

    一. 新旧域名跳转 作用场景:基于域名的跳转,现在公司旧域名:www.peihua.com 有业务需求要变更,需要使用新域名www.zhenguo.com代替,但是旧域名不能废除.需要跳转到新域名上,而且后面的参数保持不变 配置dns,分别配置www.peihua.com(old)和www.zhenguo.com(new)解析 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.

  • Nginx中rewrite(地址重定向)的深入剖析

    目录 一.rewrite语法 二.应用场景 三.rewrite指定工作原理 四.flag 参数简介 1.last 2.break 3.redirect 4.parmanent 五.示例 总结 一.rewrite语法 指令语法:rewrite regex replacement[flag] 默认值:none 应用位置:server.location.if regex是PCRE 风格的,如果regex匹配URI,那么URI就会被替换成replacement,replacement 就是新的URI.如

  • 详解Nginx中的Rewrite的重定向配置与实践

    一:理解地址重写 与 地址转发的含义. 地址重写与地址转发是两个不同的概念. 地址重写 是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上.浏览器的地址栏也会显示www.baidu.com. 地址转发:它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程. 因此地址重写和地址转发有以下不同点: 1. 地址重写会改变

  • 详解Nginx中的重定向功能

    nginx 各参数翻译,作用 $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值. $args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah; $binary_remote_addr #二进制的客户地址. $body_bytes_sent #响应时送出的body字节数数量.即使连接中断,这个数据也是精确的. $content_length #请求头中的Content-length字段. $content_typ

  • Nginx中location匹配以及rewrite重写跳转详解

    目录 前言 一.rewrite跳转实现 二.rewrite执行顺序 三.rewrite跳转场景 四.语法与flg标记说明 五.Nginx常用的正则表达式符号 六.location 1.分类 2.常用匹配规则 3.优先级 4.示例 5.匹配规则定义 总结: 前言 rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记实现URL重写以及重定向例如:更换域名后需要保持旧的域名能够转到新的域名上.某网页发生改变需要跳转到新的页面.网站防盗链等等需求 rewrite只能放

  • nginx 伪静态Rewrite正则资源汇总

    本站一个服务器本来是windows 系统,采用ISAPI_Rewrite来进行Url重写,其中有一个规则是 RewriteRule ^/(.{6})(\d{3})(.+)/php/ http://www.xxx.com/qq$2.apk [NC,L,NU] 中间用到了{6}指前面的字符得复6次,然后平移动linux系统下面,采用nginx 的Rewrite来重写url 结果加载nginx的时候提示报错 复制代码 代码如下: rewrite ^/(.{6})(\d{3})(.+)/php/ htt

  • nginx重写rewrite基础及实例分享

    nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 -f和!-f用来判断是否存在文件 -d和!-d用来判断是否存在目录 -e和!-e用来判断是否存在文件或目录 -x和!-x用来判断文件是否可执行 flag标记 last 相当于Apache里的[L]标记,表示完成rewrite break 终止匹配, 不再匹配后面的规则. redirect 返回302临时重定向 地址栏会显示

  • Nginx中泛域名配置的实例教程

    原本准备换Linux服务器,所以数据迁移暂时需要使用静态页面临时代替一下,之前的article.asp?id=xxx都要重定向到静态文件 article/xxx.htm,nginx的rewrite比apache的强大很多,还可以用if语句,很容易理解,下面看看Nginx是如何进行Rewrite的! 提示:以下rewrite指令写在 nginx.conf 配置的 server { - } 中 最常见的: 静态地址重定向到带参数的动态地址 rewrite "^(.*)/service/(.*)/.h

  • Nginx中虚拟主机与指定访问路径的设置方法讲解

    添加多个虚拟主机 最近在ubuntu上捣腾nginx,安装成功了,就只有rewrite没有试验,因为服务器上有多个网站,还不敢在服务器上尝试,慢慢来.网上查了一些文章,下了一篇留下来做试验. nginx上虚拟主机的配置其实跟apache上的基本上类似. 需要注意的几点是: 第一.关于.htaccess配置,也就是为静态配置,在nginx上一般你要写在虚拟主机的配置文本中,但是我也有看到用包含文件解决这个问题的,即在虚拟主机配置脚本上include .htaccess文件,不过没有没有试过. 第二

  • Nginx中break与last的区别详析

    先说区别 last,重写后的规则,会继续用重写后的值去匹配下面的location. break,重写后的规则,不会去匹配下面的location.使用新的规则,直接发起一次http请求了. Nginx 配置文件 server { listen 88; server_name _; location /break { # location 1 rewrite ^/break/(.*)$ /bak/$1 break; } location /last { # location 2 rewrite ^/

随机推荐