前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nginx rewrite正则匹配重写

Nginx rewrite正则匹配重写

作者头像
Leshami
发布于 2018-08-06 02:47:58
发布于 2018-08-06 02:47:58
2.3K00
代码可运行
举报
文章被收录于专栏:乐沙弥的世界乐沙弥的世界
运行总次数:0
代码可运行

Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向。这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1.org/mp3进行访问,而现在服务器上mp3目录已经被使用music目录替换,那rewrite这个功能则能够轻松实现。其次如可以将site1.org强制调整到www.site1.org,反之亦可。这个指令位于ngx_http_rewrite_module模块。本文主要描述这个指令的用法并给出演示。

一、rewrite指令语法描述

句法: rewrite regex replacement [flag]; 默认: - 语境: server,location,if   如果指定的正则表达式与请求URI匹配,则URI将按照replacement字符串中的指定进行更改。   该rewrite指令在其在配置文件中出现的顺序顺序地执行。可以使用标志终止对伪指令的进一步处理。   如果替换字符串以“ http://”,“ https://”或“ $scheme” 开头,则处理停止,并将重定向返回给客户端。

flag标志的作用是用于控制当匹配到对应的rewrite规则后是否继续检查后续的rewrite规则 可选flag参数可以是以下之一:

last   一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求; break   一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作; redirect   如果替换字符串不以“ http://”,“ https://”或“ $scheme” 开头,则使用,返回302临时重定向; permanent   返回301永久重定向;

注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;

其他指令

rewrite_log on|off   是否把重写过程记录在错误日志中;默认为notice级别;默认为off;

return code:   用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204, 400, 402-406, 500-504等;

二、基于location上下文rewrite功能演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
本机环境
  # more /etc/redhat-release
  CentOS Linux release 7.2.1511 (Core)
  # nginx -v
  nginx version: nginx/1.12.2

配置nginx
  # vim /etc/nginx/conf.d/rewrite.conf
  server {
    listen 80;
    server_name site1.orag www.site1.org;

    location / {
        root /www/site1.org;
        index index.html index.htm;
    }
  }

  # mkdir -pv /www/site1.org/images
  # echo "This is a rewrite test page.">/www/site1.org/index.html
  # cp /usr/share/backgrounds/gnome/*.jpg /www/site1.org/images/

  # vim /etc/hosts
  192.168.1.175 site1.org
  192.168.1.175 www.site1.org

  # curl http://www.site1.org
  This is a rewrite test page.

  # curl -I http://www.site1.org/images/Waves.jpg
  HTTP/1.1 200 OK
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 03:47:58 GMT
  Content-Type: image/jpeg
  Content-Length: 458818
  Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
  Connection: keep-alive
  ETag: "59f942f4-70042"
  Accept-Ranges: bytes

修改rewrite.conf文件,添加rewrite指令
  location / {
    root /www/site1.org;
    index index.html index.htm;
    rewrite ^/images/(.*)$ /imgs/$1 last;
  }

  # systemctl reload nginx

  # curl -I http://www.site1.org/images/Waves.jpg
  HTTP/1.1 404 Not Found
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 04:02:38 GMT
  Content-Type: text/html
  Content-Length: 169
  Connection: keep-alive

  # mkdir -pv /www/site1.org/imgs

  # mv /www/site1.org/images/Waves.jpg /www/site1.org/imgs/.
  # curl -I http://www.site1.org/images/Waves.jpg
  HTTP/1.1 200 OK
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 04:05:07 GMT
  Content-Type: image/jpeg
  Content-Length: 458818
  Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
  Connection: keep-alive
  ETag: "59f942f4-70042"
  Accept-Ranges: bytes

  # curl -I http://www.site1.org/imgs/Waves.jpg ##这种方式可以访问
  HTTP/1.1 200 OK
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 04:06:17 GMT
  Content-Type: image/jpeg
  Content-Length: 458818
  Last-Modified: Wed, 01 Nov 2017 03:43:48 GMT
  Connection: keep-alive
  ETag: "59f942f4-70042"
 Accept-Ranges: bytes

模拟rewrite导致的http 500错误
再次对rewrite.conf文件做如下修改,

  location / {
    root /www/site1.org;
    index index.html index.htm;
    rewrite ^/images/(.*)$ /imgs/$1 last;
    rewrite ^/imgs/(.*)$ /images/$1 ;
  }

  # systemctl restart nginx
  # curl -I http://www.site1.org/imgs/Waves.jpg
  HTTP/1.1 500 Internal Server Error
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 05:23:16 GMT
  Content-Type: text/html
  Content-Length: 193
  Connection: close

  # curl -I http://www.site1.org/images/Waves.jpg
  HTTP/1.1 500 Internal Server Error
  Server: nginx/1.12.2
  Date: Wed, 01 Nov 2017 05:23:28 GMT
  Content-Type: text/html
  Content-Length: 193
  Connection: close

通过上述的测试可知,出现了死循环导致的500错误。
Nginx官方给出的参考样例:
  server {
    ... ##rewrite指令位于server上下文
  rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
  ##将/download目录中包含media目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3

  rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
  ##将/download目录中包含audio目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3

  return 403;
    ...
  }

  location /download/ { ##rewrite指令位于location上下文
  rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
  ##该last标志应该被替换 break,否则nginx将使10个周期返回500个错误
  rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
  return 403;
  }

三、基于if条件判断rewrite功能演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  # vi /etc/nginx/conf.d/rewrite.conf
    server {
        listen 80;
        server_name site1.orag www.site1.org;

      if ($host != 'www.site1.org' ) {
          rewrite ^/(.*)$ http://www.site1.org/$1 permanent;
        }

    location / { ##Author : Leshami
        root /www/site1.org; ##Blog : http://blog.csdn.net/leshami
        index index.html index.htm;
        rewrite ^/images/(.*)$ /imgs/$1 last;
        rewrite ^/imgs/(.*)$ /images/$1 ;
    }
  }

  # systemctl reload nginx.service

本地测试(修改本地host文件)
  # curl http://site1.org
  <html> ##返回301状态码
  <head><title>301 Moved Permanently</title></head>
  <body bgcolor="white">
  <center><h1>301 Moved Permanently</h1></center>
  <hr><center>nginx/1.12.2</center>
  </body>
  </html>

Windows环境测试
通过修改Windows机器Host文件后,添加如下条目
  192.168.1.175 centos7-router.com
  192.168.1.175 www.centos7-router.com

打开浏览器,通过域名的方式进行访问http://site1.org会自动跳转到http://www.site1.org(演示略)

四、将http重写至https

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在非全站https时,对于有些敏感的数据需有走https,那也可以通过rewrite方式实现
如下示例,假定https://www.site1.org/user目录下包含敏感信息,按可按如下方式rewrite

  location ^~ /user {
  rewrite ^/ https://www.site1.org$request_uri? permanent;
  }

全站https
  server {
    listen 80;
    server_name site1.orag www.site1.org;
    access_log /var/log/nginx/http-access.log;
    error_log /var/log/nginx/http-error.log;

    rewrite ^/ https://www.site1.org$request_uri;
  }

上述演示略

Nginx相关参考:http://blog.csdn.net/robinson_0612/article/category/6215348

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nginx配置自定义变量实现日志动态分发
Nginx是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。下载地址:www.nginx.org。
神秘的寇先森
2018/12/07
5K0
后端程序员不得不会的 Nginx 转发匹配规则
而且两者有细微差别,使用alias指令必须用 last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
程序员小富
2020/03/23
2.7K0
Nginx专题: 从编译安装到URL重写
前言 本文主要实现使用Nginx作为Web服务器,并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中。 环境介绍 笔者只有一台虚拟机, 桥接到室内的路由器便于手机进行访问, IP地址为192.168.1.103。 Nginx介绍 engine x发音同Nginx,作者是Igor Sysoev,是目前世界上占有率第三的Web服务器软件. Nginx是一款轻量级的Web服务器,可实现反向代理,URL rewrite等功能。 Nginx拥有消耗内存小、可支持高并发连
小小科
2018/05/03
1.2K0
Nginx专题: 从编译安装到URL重写
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式调度后端服务器,同时也能提供健康检查功能。目前有众多公司均已经部署使用nginx实现基于七层的负载均衡功能。 1)Nginx负载均衡 为了实现Nginx的反向代理以及负载均衡功能,应用中需要用到两个模块,HttpProxyModule和HttpUpstreamModule模块;其中HttpProxyModule模块的作用是将用户的数据请求转发到其他服
洗尽了浮华
2018/01/23
7.9K0
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
第八章·Nginx实现Rewrite重写
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6280
第八章·Nginx实现Rewrite重写
nginx编译安装-nginx优化
Nginx优化 Nginx特点介绍 支持高并发能力比较强,消耗资源少 软件功能布局多样 支持平台广泛 修改NGINX版本信息 修改版本信息需要修改程序源文件信息 修改内核信息 vim src/core/nginx.h # ··· 13 #define NGINX_VERSION "1.0" 14 #define NGINX_VER "linuxboy/" NGINX_VERSION 22 #define NGINX_VAR "linuxboy" #
王先森sec
2023/04/24
1.2K0
11、nginx 防盗链问题
​ HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,
用户8639654
2021/07/14
6620
Nginx基础——Rewrite规则
rewrite是nginx一个特别重要的指令,该指令可以使用正则表达式改写URI。可以指定一个或多个rewrite指令,按顺序匹配。
芋道源码
2018/08/17
1K0
Nginx软件优化
1.1 Nginx优化分类 安全优化(提升网站安全性配置) 性能优化(提升用户访问网站效率) 1.2 Nginx安全优化 1.2.1 隐藏nginx版本信息优化 官方配置参数说明:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 官方参数: Syntax: server_tokens on | off | build | string; Default: server_tokens on; Context: http
惨绿少年
2018/03/30
1.4K0
学习笔记0516----nginx配置
在Nginx中也有默认虚拟主机,跟httpd类似,第一个被Nginx加载的虚拟主机就是默认主机,但和httpd不相同的地方是,它还有一个配置用来标记默认虚拟主机,也就是说,如果没有这个标记,第一个虚拟主机为默认虚拟主机。
嘻哈记
2020/11/24
1K0
基于CentOS 7配置Nginx反向代理
Nginx作为反向代理服务器被广泛使用在各大互联网企业。它简单易用,可以根据业务的需求将其不同的业务类型代理至不同的服务器,将整个站点请求压力按类型分摊到不同的服务器。该方式使的整个站点请求性能得以极大的提升。本文简要描述了Nginx几种不同情形的代理演示,供大家参考。
Leshami
2018/08/06
2.1K0
基于CentOS 7配置Nginx反向代理
12.9 Nginx域名重定向
Nginx域名重定向目录概要 更改test.com.conf server { listen 80; server_name test.com test1.com test2.com; index index.html index.htm index.php; root /data/wwwroot/test.com; if ($host != 'test.com' ) { rewrite ^/(.*)$ http://test.com/$1 pe
运维小白
2018/02/06
8.4K0
基于CentOS 7配置Nginx正向代理
Nginx是一款以轻量级、低内存开销、支持缓存、支持反向代理,负载均衡,电子邮件服务而著称。对于鲜为人知的是,它还可以作为一个简单易用的正向代理服务器。本文简要描述这个正向代理功能并给出演示,供大家参考。
Leshami
2018/08/06
2.3K0
nginx 进行正则匹配(常见正则匹配符号表示)
今天遇到网站之前的url被百度搜索引擎抓取,需要在服务中进行301强制跳转,(如访问:www.baidu.com/kenni-1,www.baidu.com/kenni-1/,两个统一跳转到www.b
botkenni
2019/09/09
35.3K0
12.14 Nginx访问控制
Nginx访问控制目录概要 需求:访问/admin/目录的请求,只允许某几个IP访问,配置如下: location /admin/ { allow 192.168.74.129; allow 127.0.0.1; deny all; } mkdir /data/wwwroot/test.com/admin/ echo “test,test”>/data/wwwroot/test.com/admin/1.html -t && -s reload curl -x127.0.0.1:80
运维小白
2018/02/06
3K0
Nginx Location和Rewrite深入剖析
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
星哥玩云
2022/07/26
7380
Nginx服务优化配置
1、expires缓存模块 具体配置可参考官方文档 http://nginx.org/en/docs/http/ngx_http_headers_module.html#expires [root
用户1173509
2018/03/28
8520
Nginx服务优化配置
难道只有我懂Nginx/OpenResty详解,Nginx的rewrite模块指令?
Nginx的rewrite模块即ngx_http_rewrite_module标准模块,主要功能是重写请求URI,也是Nginx默认安装的模块。rewrite模块会根据PCRE正则匹配重写URI,然后根据指令参数或者发起内部跳转再一次进行location匹配,或者直接进行30x重定向返回客户端。
愿天堂没有BUG
2022/10/28
1.6K0
难道只有我懂Nginx/OpenResty详解,Nginx的rewrite模块指令?
Nginx rewrite地址重写
Rewrite在nginx中也叫URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。
用户4396583
2024/07/23
3190
深入理解Nginx的rewrite模块
rewrite模块即ngx_http_rewrite_module模块,主要功能是改写请求URI,是Nginx默认安装的模块。rewrite模块会根据PCRE正则匹配重写URI,然后发起内部跳转再匹配location,或者直接做30x重定向返回客户端。
sunsky
2020/08/20
1.8K0
相关推荐
nginx配置自定义变量实现日志动态分发
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文