Rewrite模块

1 return指令

Syntax:	return code [text];
return code URL;
return URL;
Default: —
Context: server, location, if

返回状态码

  • nginx自定义

    • 444:关闭连接
  • HTTP1.0标准
    • 301:http1.0永久重定向
    • 302:临时重定向,禁止被缓存
  • HTTP1.1标准
    • 303:临时重定向,允许改变方法,禁止被缓存
    • 307:临时重定向,不允许改变方式,禁止被缓存
    • 308:永久重定向,不允许改变方法

示例

server {
server_name wiki.clay-wangzhi.com;
listen 8080; root html/;
error_page 404/403.html;
return 403;
location / {
return 404 "find nothing!";
}
}

return指令与errror_page

2 rewrite指令

Syntax:	rewrite regex replacement [flag];
Default: —
Context: server, location, if

功能

  • 将regex指定的url替换成replacement这个新的url

    可以使用正则表达式及变量提取

  • 当replacement以http://或者https://或者$schema开头,则直接返回302重定向

  • 替换后的url根据flag指定的方式进行处理

    如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;

    • last:

      • 浏览器地址栏URL地址不变
      • 用replacement这个URI进行新的location匹配,重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮重写检查;提前重启新一轮循环;
    • beak:

      • 浏览器地址栏URL地址不变
      • break指令停止当前脚本指令的执行,等价于独立的break指令,重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环;
    • redirect:

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

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

功能一句话概括为:使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

示例1

        root html/;
location /first {
rewrite /first(.*) /second$1 last;
return 200 'first!';
} location /second {
rewrite /second(.*) /third$1 break;
return 200 'second!';
} location /third {
return 200 'third!';
}

访问/first/1.txt的结果为:html/third/1.txt的内容

访问/second/1.txt的结果为:html/third/1.txt的内容

访问/third/1.txt的结果为:third的内容

示例2

# http://www.test.com/test/abc/1.html ⇒ http://www.test.com/ccc/bbb/2.html
location /test {
rewrite .* /ccc/bbb/2.html permanent;
} # http://www.test.com/2015/ccc/bbb/2.html ==> http://www.test.com/2014/ccc/bbb/2.html
location /2015 {
rewrite ^/2015/(.*)$ /2014/$1 permanent;
} # http://www.test.com/2015/ccc/bbb/2.html ==> http://jd.com/index.php
location /2015 {
if ($host ~* test.com) {
rewrite .* http://www.jd.com/index.php permanent;
}
} # http://www.test.com/kkk/1.html ==> http://jd.com/kkk/1.html
location / {
root html;
index index.html index.htm;
if ($host ~* test.com) {
rewrite .* http://www.jd.com/$request_uri permanent;
}
} # 有时候在访问一个二级子目录时会出现目录后的/无法补齐,如:
# elinks --dump www.test.com/www 无法访问
# elinks --dump www.test.com/www/可以访问
if (-d $request_filename) {
rewrite ^(.*)([^/])$ http://$host$1$2/ permanent;
}
# ^/(.*)([^/])$表示以/符号开始并紧跟着任何字符,同时不是以/为结束的字符串,在我的url中,(.*)表示的ww,([^/])表示的w # http://www.test.com/login/robin.html ==> http://www.test.com/reg/login.php?user=robin
location /login {
rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1 permanent;
} # http://www.test.com/uplook/10-10-10.html ==> http://www.test.com/uplook/10/10/10.html
location /uplook {
rewrite ^/uplook/([0-9]+)-([0-9]+)-([0-9]+)\.html$ /uplook/$1/$2/$3.html permanent;
} # set 指令是用于定义一个变量,并且赋值。应用于server,location,if环境。
# http://robin.test.com ==> http://www.test.com/robin
# http://zorro.test.com ==> http://www.test.com/zorro
if ($host ~* "^www.test.com$") {
break;
}
if ($host ~* "^(.*)\.test\.com$") {
set $user $1;
rewrite .* http://www.test.com/$user permanent;
}

last 一般写在server和if中,而break一般使用在location中

3 if指令

Syntax:	if (condition) { ... }
Default: —
Context: server, location

规则:条件condition为真,则执行大括号内的指令;遵循值指令的继承规则

if指令的条件表达式

  • 检查变量为空或者值是否为0,直接使用

    • 当表达式只是一个变量时,如果值为空或任何以 0 开头的字符串都会当做 false
  • 将变量与字符串做匹配,使用=或者!=
  • 将变量与正则表达式做匹配
    • 大小写敏感,或者!
    • 大小写不敏感,*或者!*
  • 检查文件是否存在,使用-f或者!-f
  • 检查目录是否存在,使用-d或者!-d
  • 检查文件、目录、软连接是否存在,使用-e或者!-e
  • 检查是否为可执行文件,使用-x或者!-x

示例

if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($repuest_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}

4 rewrite_log指令

Syntax: rewrite_log on | off;
Default: rewrite_log off;
Context: http, server, location, if

Nginx中指令的更多相关文章

  1. 干货 | 一文彻底读懂nginx中的location指令

    一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 一文带你读懂Nginx反向代理 ...

  2. Nginx中的一些匹配顺序

    Nginx中经常需要做各种配置,总结如下: 1.server_name配置 nginx中的server_name指令主要用于配置基于名称虚拟主机,同一个Nginx虚拟主机中,可以绑定多个server_ ...

  3. Nginx中FastCGI配置优化

    FastCGI: FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器 ...

  4. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  5. 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解

    看了很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面. 官方文档中提供的方法: If you d ...

  6. Nginx 配置指令location 匹配符优先级和安全问题【转】

    Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...

  7. nginx log_format指令记录自定义响应头

    我们用的nginx有做过一些定制开发,为了调试方便,加了一些自定义的response header,那么如何把这个自定义头记录到日志中以便于观察呢? nginx log_format指令支持这种扩展, ...

  8. nginx中时间的管理

    nginx出于性能考虑採用类似lib_event的方式,自己对时间进行了cache,用来降低对gettimeofday()的调用,由于一般来说server对时间的精度要求不是特别的高,只是假设须要比較 ...

  9. Nginx 配置指令的执行顺序(八)

    前面我们详细讨论了 rewrite.access 和 content 这三个最为常见的 Nginx 请求处理阶段,在此过程中,也顺便介绍了运行在这三个阶段的众多 Nginx 模块及其配置指令.同时可以 ...

随机推荐

  1. 【死磕 NIO】— 深入分析Buffer

    大家好,我是大明哥,今天我们来看看 Buffer. 上面几篇文章详细介绍了 IO 相关的一些基本概念,如阻塞.非阻塞.同步.异步的区别,Reactor 模式.Proactor 模式.以下是这几篇文章的 ...

  2. python3 在webelement对象里面获取元素路径的方法

    一. 在webelement对象里面使用查找Xpath 查找时,必须使用.指明当前节点 food = driver.find_element_by_id('food') eles = food.fin ...

  3. soname and real name

    [1] https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes#Backward_compatibility [2] https://akka ...

  4. [loj3014]独特的城市

    约定:一棵树的深度定义为其中到根最远的点到根的距离 考虑节点$x$的答案: 任取一条直径,根据直径的性质,到$x$较远的直径端点一定是到$x$最远的点之一 由此,不难证明对于$x$独特的点,一定在$x ...

  5. [luogu3334]抛硬币

    (数据范围的公式渲染有一些问题,大概是$a\le b\le 100$) 同洛谷4548,推导过程省略,直接给出答案-- 令$p_{H}=\frac{b}{a}$,$p_{T}=\frac{b}{b-a ...

  6. MyBatis-Plus中如何使用ResultMap

    MyBatis-Plus (简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发.提高效率而生. MyBatis-Plus对MyBatis基本零侵入,完全可以 ...

  7. 钓鱼小技巧-XLM

    前言 XLM钓鱼不是一项新的技术,自从公开以后,网上有很多对其的分析文章,这里仅仅做一个分享和摸索记录.文章中有问题的地方还请指出. 一个简单的例子 新建一个excel表格,右键选择表,选择插入 插入 ...

  8. Jenkins快速上手安装

    目录 环境准备 - JDK 安装 1. APT 安装 2. WAR包方式运行 3.Docker 方式运行 Jenkins 是一个独立的开源自动化服务器,可以用来自动化与构建.测试.交付或部署软件相关的 ...

  9. Collection集合框架与Iterator迭代器

    集合框架 集合Collection概述 集合是Java中提供的一种容器,可以用来存储多个数据 集合与数组的区别: 数组的长度固定,集合的长度可变 数组中存储的是同一类型的元素,可以存储基本数据类型值, ...

  10. Atcoder Grand Contest 034 F - RNG and XOR(FWT)

    Atcoder 题面传送门 & 洛谷题面传送门 tsc 考试前 A 的题了,结果到现在才写这篇题解--为了 2mol 我已经一周没碰键盘了,现在 2mol 结束算是可以短暂的春天 短暂地卷一会 ...