热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginxrewrite模块探究与实验

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

关于nginx中的rewrite,之前的理解总感觉有些不精确。比如以下问题,经过rewrite之后:

      什么情况会返回200?

      什么情况会返回301/302?

      什么情况浏览器里的url不变?

      什么情况浏览器里的url会变?

      什么情况匹配一次就不再匹配之后的规则或location?

      什么情况匹配到一条规则后,会以rewrite之后的url再到server段走一遍

如果读者能理解清楚以上问题,则说明对nginx的rewrite整体上已经有了全面的认识。

接下来我们针对以上问题,来通过试验逐一解答

实验环境:nginx 1.8

网站根目录:nginx/html

注:在http段或者server段添加rewrite_log on;并且设置error_log为notice级别,可以在error og里捕捉到rewrite的过程

一、先实验一个最简单的:http://172.16.25.162/ljk.html。该文件不在在html下,而在在html/wordpress下

server {

        listen        80;

        server_name  localhost;

        rewrite_log on;

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1;

          }

        }

观察nginx访问日志和错误日志

access_log:

"GET /ljk.html HTTP/1.1" 200

error_log:

*98 "^/(.+\..+)$" matches "/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

*98 rewritten data: "/wordpress/ljk.html", args: "", client:172.16.25.3, server: localhost, request: "GET /ljk.html

浏览器里的url没有改变,状态码返回200

#

由此可见,如此配置实现了一个最简单的内部跳转。

二、再进一步,看一个两级的rewrite。将html/wordpress/下的ljk.html移到html/ljk/下,并且在location /wordpress 下配置重写规则

        location / {

            root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1;

          }

        }

        location /wordpress  {

            if (!-e $request_filename) {

              rewrite ^/wordpress/(.+\..+)$ /ljk/$1;

            }

        }

access_log:

"GET /ljk.html HTTP/1.1" 200

error_log:可以看到两次匹配与重写的过程

*99 "^/(.+\..+)$" matches "/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

*99 rewritten data: "/wordpress/ljk.html", args: "", client:172.16.25.3, server: localhost, request: "GET /ljk.html

*99 "^/wordpress/(.+\..+)$" matches "/wordpress/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

*99 rewritten data: "/ljk/ljk.html", args: "", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

浏览器url依然不变

#

以上两个实验对用户透明,用户通过返回码或者地址栏url均不可感知rewrite的存在,可以看做‘内部重定向’;那么什么时候会产生‘外部重定向’呢,现在先试试Permanent、redirect两个标志

三、重写规则后加上 permanent 标志

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1 permanent;

          }

        }

访问http://172.16.25.162/ljk.html

access_log:

GET /ljk.html HTTP/1.1" 301    返回301

GET /wordpress/ljk.html HTTP/1.1" 200

注意此处产生了两个请求

error_log:

*107 "^/(.+\..+)$" matches "/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

      *107 rewritten redirect: "/wordpress/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

浏览器地址栏变成了rewrite后的url

#

四、重写规则后加上 redirect 标志

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1 redirect;

          }

access_log:    两个请求

"GET /ljk.html?sds HTTP/1.1" 302    临时重定向302

"GET /wordpress/ljk.html HTTP/1.1" 200

error_log:

*108 "^/(.+\..+)$" matches "/ljk.html", client: 172.16.25.3, server: localhost, request: "GET /ljk.html

      *108 rewritten redirect: "/wordpress/ljk.html?sds", client: 172.16.25.3, server: localhost, request: "GET /ljk.ht        ml?sds

浏览器地址栏变成了rewrite后的url

#

由三四得出结论:Permanent、redirect两个标志控制是否将重过程在用户端体现出来(即将重写后的url显示在客户端)同时返回301 or 302。

然后再试试last和break两个标志(需要两层及以上跳转来测试)

按照网上较为普遍的说法:

假如一个location里有多条rewrite规则,都是不在该location继续往下匹配,但是

last: 匹配完该条语句后得到的url,重新到server标签下走一遍

break:到此为止(直接以重写后的url在服务器寻找资源)

实验环境:删除html/wordpress下的ljk.html,将ljk.html放置在html/ljk/ljk.html,然后在server标签下配置location /wordpress 的rewrite规则

五、先来看下两次rewrite 规则不加标志的情况

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1;

          }

        }

        location /wordpress  {

            if (!-e $request_filename) {

              rewrite ^/wordpress/(.+\..+)$ /ljk/$1;

            }

        }

access_log:

GET /ljk.html HTTP/1.1" 200

error_log:    经历两次匹配和重写

      *111 "^/(.+\..+)$" matches "/ljk.html",

      *111 rewritten data: "/wordpress/ljk.html", args: "",

*111 "^/wordpress/(.+\..+)$" matches "/wordpress/ljk.html",

*111 rewritten data: "/ljk/ljk.html", args: "",

浏览器地址栏url不变

六、实验break标志

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1 break;

          }

        }

        location /wordpress  {

            if (!-e $request_filename) {

              rewrite ^/wordpress/(.+\..+)$ /ljk/$1;

            }

        }

access_log:

    GET /ljk.html HTTP/1.1" 404

error_log:

    *112 "^/(.+\..+)$" matches "/ljk.html",

    *112 rewritten data: "/wordpress/ljk.html", args: "",

    *112 open() "/usr/local/nginx/html/wordpress/ljk.html" failed (2: No such file or directory),

加了break,所以在重写成‘wordpress/ljk.html’就没有再走到location /wordpress
 

七、实验last标志

        location / {

          root  /usr/local/nginx/html;

          index  index.shtml index.php index.html;

          if (!-e $request_filename) {

              rewrite ^/(.+\..+)$ /wordpress/$1 last;

          }

        }

        location /wordpress  {

            if (!-e $request_filename) {

              rewrite ^/wordpress/(.+\..+)$ /ljk/$1;

            }

        }

访问http://172.16.25.162/ljk.html

access_log:

    GET /ljk.html HTTP/1.1" 200

error_log:

    *113 "^/(.+\..+)$" matches "/ljk.html",

    *113 rewritten data: "/wordpress/ljk.html", args: "",

    *113 "^/wordpress/(.+\..+)$" matches "/wordpress/ljk.html",

    *113 rewritten data: "/ljk/ljk.html", args: "",
 

由五六七可得出结论:


加break标志时,url一旦找到匹配额规则,就会停止继续匹配并以该rewrite后额url去服务器请求资源;

加last标志或者不加任何标志,其‘过程’和‘结果’一致,会以rewrite后的url再重新到server段下走一遍配置。

并且这两个标志都不会改变浏览器地址栏的url,且返回码亦为200或404等(即对用户透明)

八、涉及到域名重定向实验

    server {

        listen        80;

        server_name  localhost;

        rewrite_log on;

        rewrite ^(.*)$ http://www.baidu.com;

}

若rewrite规则后不加标志或者加redircet标志,都会返回“GET / HTTP/1.1" 302”临时重定向

当rewrite规则后加permanent 标志,会返回“GET / HTTP/1.1" 301”永久重定向
 

希望这篇文章能对理解nginx的rewrite有一些帮助!

更多Nginx负载均衡配置相关教程见以下内容

Nginx负载均衡配置说明 2016-03/129424.htm

Linux下Nginx+Tomcat负载均衡和动静分离配置要点  2016-01/127255.htm

Docker+Nginx+Tomcat7配置简单的负载均衡  2015-12/125907.htm

Nginx负载均衡(主备)+Keepalived  2015-12/126865.htm

使用Nginx作为负载均衡器 2015-12/125789.htm

使用Nginx简单实现负载均衡  2016-08/134443.htm

Nginx负载均衡与高可用的实现 2016-04/130350.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里


推荐阅读
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • hadoop1.2.1文档中这样写:Nowcheckthatyoucansshtothelocalhostwithoutapassphrase:$sshlocalhostIfyou ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有