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. Go语言核心36讲(Go语言实战与应用八)--学习笔记

    30 | 原子操作(下) 我们接着上一篇文章的内容继续聊,上一篇我们提到了,sync/atomic包中的函数可以做的原子操作有:加法(add).比较并交换(compare and swap,简称 CA ...

  2. python实现其它形态学操作

    目录: (一) 顶帽(原图像与开操作图像的差值)(二) 黑帽(原图像与闭操作图像的差值)(三) 形态学梯度  (1)基本梯度(膨胀后的图像与腐蚀后的图像差值)  (2)内部梯度(原图像减去腐蚀后的图像 ...

  3. [loj2136]地震后的幻想乡

    考虑kruskal的过程:对$n$条边随机排列(排序),令$k$表示前$k$条边恰好能使图联通,根据题目的提示,即$E(\frac{k}{m+1})=\frac{E(k)}{m+1}$ 设$p(k)$ ...

  4. 第02章_MySQL环境搭建

    第02章_MySQL环境搭建 1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止MySQL8.0的服务.按键盘上的"Ctrl + Alt + Delete"组合 ...

  5. android测试之monkey测试

    1.首先安装SDK包 2.配置环境变量 3.打开CMD命令窗口,查看是否安装成功 命令:adb version 4.要做monkey测试的安卓包名,获取方式如下(必须启动要获取报名的app) 1.ad ...

  6. WebRTC从摄像头获取图片传入canvas

    WebRTC从摄像头获取图片传入canvas 前面我们已经能够利用WebRTC的功能,通过浏览器打开摄像头,并把预览的图像显示在video元素中. 接下来我们尝试从视频中截取某一帧,显示在界面上. h ...

  7. k8s-Pod污点与容忍

    目录 Pod污点与容忍 大白话先解释一下污点与容忍 为什么要用污点和容忍? 官方解释 Taints参数 标记污点 容忍污点 取消所有节点污点 Pod污点与容忍 大白话先解释一下污点与容忍 污点:被打上 ...

  8. 第十四章 kubernetes 核心技术-调度器

    一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...

  9. bilibili动画下载视频批量改名(python)

    bilib应用 在微软商店中下载哔哩哔哩动画,虽然软件UI古老,但是贵在稳定和支持下载 安装以后搜索自己想要的视频,然后缓存下载 下载后进入下载的路径 视频文件重命名 打开自动命令的程序或者py脚本, ...

  10. C/C++ Qt Tree与Tab组件实现分页菜单

    虽然TreeWidget组件可以实现多节点的增删改查,但多节点操作显然很麻烦,在一般的应用场景中基本上只使用一层结构即可解决大部分开发问题,TreeWidget组件通常可配合TabWidget组件,实 ...