nginx——rewrite模块

1.什么是Nginx的Rewrite规则?
Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl
Compatible Regular Expressions)Perl兼容正则表达式的语法进行规则匹配,如果

您需要Nginx的Rewrite功能,在编译Nginx之前,须要编译安装PCRE库.
通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向及选择配置.

(1)一些使用MVC框架的程序只有一个入口,可以通过Rewrite来实现.
(2)一些动态URL地址须要伪装成静态HTML,便于搜索引擎抓取,也需要Rewrite来处理
(3)一些由于目录结构,域名变化的旧URL,须要跳转到新的URL上,可以通过Rewrite来

处理.

2.Nginx Rewrite规则相关指令
if , rewrite , set , return , break
(1)break,完成当前的规则集,不再处理rewrite指令.
(2)if

语法: if(condition){...}
用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句.if指令不支持嵌

套,不支持多个条件&&和||处理.
以下信息可以被指定为条件:
1)变量名,其中错误的值包括:空字符串"",或者任何以0开始的字符串.
2)变量比较可以使用=和!=运算符
3)"~"符号表示区分大小写字母的匹配.
4)"~*"符号表示不区分大小写字母的匹配.如firefox和FireFox是匹配的.
5)"!~"和"!~*"符号的作用刚好和"~","!~"相反,表示不匹配.
6)"-f"和"!-f"用来判断文件是否存在.
7)"-d"和"!-d"用来判断目录是否存在.
8)"-e"和"!-e"用来判断文件或目录是否存在.
9)"-x"和"!-x"用来判断文件是否可执行.
(3)return 语法:return code
该指令用于结束规则的执行并返回状态码给客户端.状态码可以使用这些

值:204,400,402-406,408,410,413,416,及500-504.非标准状态码,444将以不发送

任何Header头的方式结束连接.
403Forbidden.服务器已经理解请求,但是拒绝执行它.
404Not Found.请求失败,请求所希望得到的资源未在服务器上发现.404这个状态码

被广泛应用于当服务器不想揭示为何请求被拒绝,或者没有其他适合的响应可用的情

况下.
500Internal Server Error.服务器遇到一个未曾预料的状况,导致它无法完成对请

求的处理.一般来说,这个问题都会在服务器的程序码出错时出现.
502Bad Gateway.作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收

到无效的响应.
503Service Unavailable.由于临时的服务器维护或过载,服务器当前无法处理请求.

这个状况是临时的,并且将在一段时间以后恢复.503状态码的存在并不意味着服务器

在过载的时候必须使用它.某些服务器只不过是希望拒绝客户端的连接.
504 Gateway Timeout作为网关或代理工作的服务器尝试执行请求时,未能及时从上

游服务器(URI标识出的服务器,例如HTTP,FTP,LDAP)或辅助服务器(例如DNS)收到响

应.
(4)rewrite指令.语法:rewrite regex replacement flag .该指令根据表达式来重

定向URI,或者修改字符串.指令根据配置文件中的顺序来执行.注意重写表达式只对

相对路径有效.如果想配对主机名,应该使用If语句.
rewrite指令的最后一项参数为flag标记,支持的flag标记有:
last——相当于Apache里的[L]标记,表示完成rewrite.
break——本条规则匹配完成后,终止匹配,不再匹配后面的规则.
redirect——返回302临时重定向,浏览器地址栏会显示跳转后的URL地址.
permanent——返回301永久重定向,浏览器地址栏会显示跳转后的URL地址.
在以上标记中,last和break用来实现URI重写,浏览器地址栏的URL地址不变,但在服

务器端访问的路径发生了变化.redirect和permanent用来实现URL跳转,浏览器地址

栏会显示跳转后的URL地址.
1)一般在根location中(即location/{...})或直接在server标签中编写rewrite规则

.推荐使用last标记,在非根location中(location/cms/{...}),则使用break标记.
如:
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last ;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last ;
return 403 ;

location /download/{
  rewrite ^(/download/.*)/media/(.*)\..*$
$1/mp3/$2.mp3 break ;
  rewrite ^(/download/.*)/audio/(.*)\..*$
$1/mp3/$2.ra break ;
  return 403 ;
}
2)如果被替换的URI中含有参数(即类似/app/test.php?id=5之类的URI),默认情况

下参数会被自动附加到替换串上,你可以通过在替换串的末尾加上?标记来解决这一

问题.不加?标记和加上?标记的URL跳转区别:

rewrite ^/test(.*)$ http://www.yourdomain.com/home permanent
;
访问http://www.yourdomain.com/test?id=5 经过301跳转后的URL地址为

http://www.yourdomain.com/home?id=5

rewrite ^/test(.*)$ http://www.yourdomain.com/home? permanent
;
访问http://www.yourdomain.com/test?id=5 经过301跳转后的URL地址为

http://www.yourdomain.com/home

(5)set指令.语法: set variable value .该指令用于定义一个变量,并给变量赋值.

变量的值可以为文本,变量及文本变量的联合.例如: set $varname ‘hello‘ ;u

(6)uninitialized_variable_warn 指令. 语法uninitialized_variable_warn
on|

off 该指令用于开启或关闭记录关于未初始化变量的警告信息,默认值为开启.

(7)Nginx Rewrite可以用到的全局变量.
在if , location , rewrite 指令中,可以使用以下局部变量.
$args , $content_length , $content_type ,$document_root ,
$document_uri,

$host , $http_user_agent , $http_cookie , $limit_rate ,

$request_body_file , $request_method , $remote_addr , $remote_port
,

$remote_user , $remote_filename , $request_uri , $query_string ,
$scheme

,$server_protocol , $server_addr , $server_name , $server_port ,
$uri

时间: 07-09

nginx——rewrite模块的相关文章

nginx rewrite模块探究与实验

关于nginx中的rewrite,之前的理解总感觉有些不精确.比如以下问题,经过rewrite之后: 什么情况会返回200? 什么情况会返回301/302? 什么情况浏览器里的url不变? 什么情况浏览器里的url会变? 什么情况匹配一次就不再匹配之后的规则或location? 什么情况匹配到一条规则后,会以rewrite之后的url再到server段走一遍 如果读者能理解清楚以上问题,则说明对nginx的rewrite整体上已经有了全面的认识. 接下来我们针对以上问题,来通过试验逐一解答 实验

nginx rewrite标签配置以及用户认证配置

一.nginx  rewrite标签 rewrite 实现URL的改写主要是实现伪静态 1.  rewrite指令语法 指令语法:rewrite regex replacement[flag] 默认值:none 应用位置:server,location,if rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记,下面是一个简单的URL Rewrite跳转 Rewrite ^/(.*)http://www.eti

nginx rewrite php的CI(CodeIgniter)框架

一. 了解nginx rewrite: 正则表达式匹配,其中: * ~ 为区分大小写匹配    * ~* 为不区分大小写匹配    * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: * -f和!-f用来判断是否存在文件    * -d和!-d用来判断是否存在目录    * -e和!-e用来判断是否存在文件或目录    * -x和!-x用来判断文件是否可执行 flag标记有: * last 相当于Apache里的[L]标记,表示完成rewrite    * bre

mac下Nginx+lua模块编译安装

Nginx的nb之处就不说了,lua也是一个小巧的脚本语言,由标准C编写而成,几乎可以运行在所有的平台上,也非常强大,其他特性请自行度娘.nginx_lua_module是由淘宝的工程师清无(王晓哲)和春来(章亦春)所开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx的能力 http://wiki.nginx.org/HttpLuaModule 下面说说mac下Nginx如何编译集成nginx_lua_module模块 1. 下载nginx需

nginx rewrite重写与防盗链配置

nginx rewrite重写规则与防盗链配置方法 时间:2016-02-04 15:16:58来源:网络 导读:nginx rewrite重写规则与防盗链配置方法,rewrite规则格式中flag标记的几种形式,盗链时返回403错误,允许的域名直接跟在第二行的域名后面. nginx rewrite重写规则与防盗链配置方法 nginx rewite 规则,官方文档:http://wiki.nginx.org/NginxHttpRewriteModule nginx rewrite规则格式:rew

Nginx常用模块和请求处理流程简介

Nginx由内核和模块组成的,其中内核完成的工作比较简单,仅仅通过查找配置文件见客户端请求映射到一个location block,然后又这个location block中所配置的每个指令将会启动不同的模块去完成相应的工作. 一.nginx模块 (1)从结构上nginx分为核心模块,基础模块和第三方模块,例如 HTTP模块.MAIL模块.EVENT模块属于核心模块: HTTP ACCESS模块.HTTP REWRITE模块.HTTP FastCGI模块.HTTP PROXY模块属于基础模块: HT

单独编译apache的rewrite模块

 单独编译apache的rewrite模块 当我们编译安装好apache的时候,就像这样: ./configure \ --prefix=/usr/local/apache \   //安装的路径 --with-included-apr \        // 跨平台 --enable-so \                 //启用DSO --enable-deflate=shared \    //动态共享的方式编译deflate模块 --enable-expires=shared \  

Nginx rewrite 中break与last指令的区别

PS:原创文章,如需转载,请注明出处,谢谢! 本文地址:http://flyer0126.iteye.com/blog/2257670 nginx rewrite指令语法:rewrite regex replacement [flag];默认值:无作用域:server,location,if如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写.rewrite按配置文件中出现的顺序执行.flags标志可以停止/继续处理.如果replacement以"http://&

翻译:为 URL Rewrite 模块创建重写规则

原文名称:Creating Rewrite Rules for the URL Rewrite Module 原文地址:http://www.iis.net/learn/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module 原文作者:Ruslan Yakushev URL Rewrite 模块是 IIS 服务器的一个可下载的扩展模块,在  Windows Azure Web Sites (W