添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文使用之前制作的Docker容器 <<Docker案例:搭建nginx服务>> 演示Nginx四种重写类型的区别和效果,如果尚未构建Docker服务可参考之前的文章,或者自建Nginx服务。

1 Nginx重写简介

Nginx重写功能(Rewrite)由 ngx_http_rewrite_module 模块提供,可使用正则表达式改变请求的URI,返回重定向地址或内容,并可以根据条件选择适当的配置。

1.1 Rewrite指令格式

重写指令格式如下:

# 关键字 正则表达式 代替的内容 重写类型
rewrite regex replacement [flag]

1.2 重写类型

Nginx重写类型 [flag]lastbreakredirectpermanent四种,如下:

  • last:本条重写规则匹配完成后,终止匹配后续重写规则,并重新发起请求继续匹配新的location URI规则;浏览器地址栏URL地址不变
  • break:本条重写规则匹配完成后,终止匹配后续重写规则; 浏览器地址栏URL地址不变
  • redirect:返回302临时重定向,浏览器地址会显示重写后的URL地址
  • permanent:返回301永久重定向,浏览器地址会显示重写后的URL地址

1.3 重写配置

为了演示四种重写类型的不同,在nginx的配置中添加/last/break/redirect/permanent/rewrite五个路由地址,完整配置如下:

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    root   /usr/share/www/site1;
    location / {
        index  index.html index.htm;
    # 请求重定向测试
    location /rewrite {
        add_header Content-Type 'text/html; charset=utf-8';
        return 200 'message in rewrite';
    # last
    location /last {
        add_header Content-Type 'text/html; charset=utf-8';
        rewrite ^/last /rewrite last;
    # break
    location /break {
        add_header Content-Type 'text/html; charset=utf-8';
        rewrite ^/break /rewrite break;
        # rewrite ^/break http://www.crane.run break;
    # 临时重定向
    location /redirect {
        add_header Content-Type 'text/html; charset=utf-8';
        rewrite ^ http://www.crane.run redirect;
    # 永久重定向
    location /permanent {
        add_header Content-Type 'text/html; charset=utf-8';
        rewrite ^ http://www.crane.run permanent;
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;

配置完成后,由于nginx服务在docker容器中,所以需要重新加载docker容器内nginx服务的配置,在宿主机执行如下docker指令:

docker exec -it nginx nginx -s reload

2 请求测试

下面通过浏览器访问相关地址来测试上面几种重写类型。

2.1 last

访问 http://localhost:8880/last,如上一步中的配置,请求重写到/rewrite路由,如下图:

实际上重写规则匹配成功之后,nginx又根据重写路由发起了一个新的请求,并返回新请求的返回结果当做初始请求的结果

2.2 break

访问 http://localhost:8880/break,如上一步中的配置,请求重写到/rewrite路由,如下图。

实际上重写规则匹配成功之后,不再发起新的请求,也就不存在重新匹配location的过程,所以重写的/rewrite路由对于当前请求来讲是个不存在的资源;假如重写的资源存在,例如替换为可访问的网络地址,则请求是成功的

2.3 redirect

访问 http://localhost:8880/redirect,如上一步中的配置,Nginx返回302临时重定向状态码重定向到指定地址。浏览器地址变成重定向后的新地址。如下图:
在这里插入图片描述

2.4 permanent

访问 http://localhost:8880/permanent,如上一步中的配置,Nginx返回301永久重定向状态码重定向到指定地址。浏览器地址变成重定向后的新地址。如下图:
在这里插入图片描述

2.5 停止Nginx服务

停止docker容器的nginx服务,指令如下:

docker stop nginx

在这里插入图片描述
停止nginx服务后,重新访问http://localhost:8880/redirecthttp://localhost:8880/permanent效果如下图:
在这里插入图片描述
在这里插入图片描述

通过上面的验证,结合官方文档,可见几种重写的区别:

  • break与last都停止处理后续重写规则,只不过last会重新发起新的请求并使用新的请求路由匹配location,但break不会。所以当请求break时,如匹配成功,则请求成功,返回200;如果匹配失败,则返回404。
  • 服务器配置好redirect和permanent之后,打开浏览器分别访问这两个请求地址,然后停止Nginx服务。这时再访问redirect请求会直接报出无法连接的错误。但是permanent请求是永久重定向,浏览器会忽略原始地址直接访问永久重定向之后的地址,所以请求仍然成功。(这个验证不能禁用浏览器的缓存,否则即使是permanent重定向,浏览器仍然会向原始地址发出请求验证之前的永久重定向是否有效)
  • 对于搜索引擎来说,搜索引擎在抓取到301永久重定向请求响应内容的同时也会将原始的网址替换为重定向之后的网址,而对于302临时重定向请求则仍然会使用原始的网址并且可能会被搜索引擎认为有作弊的嫌疑。所以对于线上正式环境来讲,尽量避免使用302跳转
  • 如果replacement以”http://”或”https://”或“$scheme”开始,处理过程将终止,并将这个重定向直接返回给客户端。

[1] 搞懂nginx的rewrite模块
[2] 官方Rewrite文档
[3] 301和302对SEO的影响

break与last都停止处理后续重写规则,只不过last会重新发起新的请求并使用新的请求路由匹配location,但break不会。所以当请求break时,如匹配成功,则请求成功,返回200;如果匹配失败,则返回404。服务器配置好redirect和permanent之后,打开浏览器分别访问这两个请求地址,然后停止Nginx服务。这时再访问redirect请求会直接报出无法连接的错误。但是permanent请求是永久重定向,浏览器会忽略原始地址直接访问永久重定向之后的地址,所以请求仍然成功......
导读:nginx rewrite重写规则与防盗链配置方法,rewrite规则格式中flag标记的几种形式,盗链时返回403错误,允许的域名直接跟在第二行的域名后面。 nginx rewrite重写规则与防盗链配置方法如下所示: nginx rewite 规则,官方文档:http://wiki.nginx.org/NginxHttpRewriteModule nginx rewrite规则格式:rewrite regex replacement flag flag标记有四种格式: last – 相当于Apache中的L break – 中止Rewirte,不在继续匹配 redirect
last 相当于Apache里的[L]标记,表示完成rewrite break 终止匹配, 不再匹配后面的规则。 redirect 返回302临时重定向 地址栏会显示跳转后的地址。 permanent 返回301永久重定向 地址栏会显示跳转后的地址。
今天在给某网站写rewrite重定向规则时,碰到了这个关于重定向的参数处理问题。默认的情况下,Nginx在进行rewrite后都会自动添加上旧地址中的参数部分,而这对于重定向到的新地址来说可能是多余。虽然这也不会对重定向的结果造成多少影响,但当你注意到新地址中包含有多余的“?xxx=xxx”时,心里总还是会觉得不爽。那么该如何来处理这部分的内容呢?看了下面两个简单的例子你就会明白了。 把http://example.com/test.php?para=xxx 重定向到 http://exampl
安装Tomcat的前提下:需要安装JDK,并配置好JDK环境 下载linux版本的Tomcat的安装包 下载安装tomcat(http://tomcat.apache.org/)我这边是下载的apache-tomcat-8.0.50.tar.gz tar -zxvf apache-tomcat-8.0.50.tar.gz 我是放在了usr/local/tomcat下所以要创建to...
文章目录1、什么是Rewrite**Nginx Rewrite 相关指令有 if、rewrite、set、return**Rewrite flag案例跳转目录案例2目录跳转案例3 跳转到其他网站案例4 跳转到其他网站跟3一样案例5绕一圈找自己案例从一个目录跳转到另外一个目录案例进行切换目录 类似切片set 指令 set 指令是用于定义一个变量,并且赋值2.5、return 指令last,break详解root 、alias 指令区别** Nginx 地址重写 rewrite****加粗样式 1、什么是R
总结: rewrite 可以在 server location 块, 正则比配的时候才重写,所以多条 rewrite 顺序靠前且匹配的优先执行。 break跳出rewrite阶段,不会在匹配,进入输出阶段。 last 类似重新发起请求,所以会重新进行匹配。 转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.html http...
Nginx URL重写rewrite)介绍 和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginxrewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持 rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。 rewrite语法格式及参数语法说明如下:
在使用nginx配置rewrite中经常会遇到有的地方用last并不能工作,换成break就可以,其中的原理是对于根目录的理解有所区别,按我的测试结果大致是这样的。 location / proxy_pass http://test; alias /home/html/; root /home/html; rewrite ^/a/(.*)\.html$ /1.html last; 在location / { 配置里: 1、使用root指定源:使用last和break都可以 2、使用proxy_pass指定源:使用last和break都可以 3、使用alias指定
redirect: 临时重定向,请求日志中的状态码为302。 从实现功能的角度上去看,permanentredirect 是一样的,都是把旧网址重定向到新网址。不存在好坏,也不存在什么性能上的问题。但是对seo会有影响,这里要根据需要做出选择。 rewite 在server块下,会优先执行rewrite部分,然后才会去匹配location块 server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空 location中的rewirte: 不写last和break - 那么流程就是依次执行这些rewrite 1. rewrite break   url重... (1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。 注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location (2)last 和 break 当出现在location 内部时,两者就存在了差异 last: 使用了last 指令,rewrite 后会跳出locati... 这段代码会将所有以 /api/ 开头的请求重写为 /new/api/,然后将请求转发到后端服务器。其中,backend_server 表示后端服务器的地址。 例如,当你访问 http://yourdomain.com/api/user/info 时,Nginx 会将其重写为 http://yourdomain.com/new/api/user/info,并将请求转发到后端服务器。 注意,这里使用了 proxy_pass 来将请求转发到后端服务器,因此需要在 Nginx 的配置文件中添加一个 upstream 块来定义后端服务器的地址。例如: upstream backend_server { server 127.0.0.1:8000; 这段代码表示将请求转发到本地的 8000 端口。你需要将其替换为实际的后端服务器地址。