nginx中rewrite用法

一、rewrite规则

rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如http://seanlook.com/a/we/index.PHP?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];

如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

二、rewrite与location区别及执行过程

表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:

1、执行server块的rewrite指令

2、执行location匹配

3、执行选定的location中的rewrite指令

提示:如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

三、rewrite语法格式及参数说明

1、rewrite语法格式

rewrite语法格式:rewrite regex replacement [flag];


rewrite


<regex>


<replacement>


[flag];


关键字


正则


替代内容


flag标记

flag标记说明:

last  #本条规则匹配完成后,继续向下匹配新的location URI规则

break  #本条规则匹配完成即终止,不再匹配后面的任何规则

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

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

例1:rewrite ^/(.*) http://www.test.com/$1 permanent;

例1说明:

rewrite为固定关键字,表示开始进行rewrite匹配规则

regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址

replacement部分是http://www.test.com/$1,$1是取自regex部分()里的内容。匹配成功后跳转到的URL。

flag部分 permanent表示永久301重定向标记,即跳转到新的 http://www.test.com/$1 地址上

2、rewrite 常用正则表达式说明


字符


描述


.


匹配除换行符以外的任意字符


?


匹配前面的字符零次或一次


+


匹配前面的字符一次或多次


*


匹配前面的字符0次或多次


\d


匹配一个数字字符。等价于[0-9]


\


将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”


^


匹配字符串的开始


$


匹配字符串的结尾


{n}


匹配前面的字符n次


{n,}


匹配前面的字符n次或更多次


[c]


匹配单个字符c


[a-z]


匹配a-z小写字母的任意一个

小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

3、if指令和可使用的全局变量

(1)if判断指令语法

if ( 条件判断 )

{ rewrite ... }

对给定的条件进行判断。如果为真,大括号内的rewrite指令将被执行,if条件可以是如下任何内容:当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false


=或!=


直接比较变量和内容


~


区分大小写正则表达式匹配


~*


不区分大小写的正则表达式匹配


!~


区分大小写的正则表达式不匹配


-f和!-f


用来判断文件是否存在


-d和!-d


用来判断目录是否存在


-e和!-e


用来判断文件或目录是否存在


-x和!-x


用来判断文件是否可执行

if指令语法实例

#如果UA包含"MSIE",rewrite请求到/msid/目录下

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /msie/$1 break;

}

#如果cookie匹配正则,设置变量$id等于正则引用部分

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {

set $id $1;

}

#如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ($request_method = POST) {

return 405;

}

#限速,$slow可以通过 set 指令设置

if ($slow) {

limit_rate 10k;

}

#如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

if (!-f $request_filename){

break;

proxy_pass  http://127.0.0.1;

}

#如果query string中包含"post=140",永久重定向到example.com

if ($args ~ post=140){

rewrite ^ http://example.com/ permanent;

}

#防盗链

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked www.jefflei.com www.leizhenfang.com;

if ($invalid_referer) {

return 404;

}

}

(2)if判断可使用的全局变量


变量名称


变量说明


$args


这个变量等于请求行中的参数,同$query_string


$content_length


请求头中的Content-length字段


$content_type


请求头中的Content-Type字段


$document_root


当前请求在root指令中指定的值


$host


请求主机头字段,否则为服务器名称


$http_user_agent


客户端agent信息


$http_cookie


客户端cookie信息


$limit_rate


这个变量可以限制连接速率


$request_method


客户端请求的动作,通常为GET或POST


$remote_addr


客户端的IP地址


$remote_port


客户端的端口


$remote_user


已经经过Auth Basic Module验证的用户名


$request_filename


当前请求的文件路径,由root或alias指令与URI请求生成


$scheme


HTTP方法(如http,https)


$server_protocol


请求使用的协议,通常是HTTP/1.0或HTTP/1.1


$server_addr


服务器地址,在完成一次系统调用后可以确定这个值


$server_name


服务器名称


$server_port


请求到达服务器的端口号


$request_uri


包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”


$uri


不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”


$document_uri


与$uri相同

例:

http://localhost:88/test1/test2/test.php

$host:localhost

$server_port:88

$request_uri:http://localhost:88/test1/test2/test.php

$document_uri:/test1/test2/test.php

$document_root:/var/www/html

$request_filename:/var/www/html/test1/test2/test.php

原文地址:http://blog.51cto.com/longlei/2148205

时间: 2024-10-12 13:43:34

nginx中rewrite用法的相关文章

Nginx中 Rewrite学习笔记

路由重写是Web服务器中的一个很重要的基本功能.通过路由重写,可以结构化URL,更具语义化(对SEO有益).另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题. 适当的使用Rewrite功能,可以更我们带来很多的好处.Nginx中Rewrite的功能是基于perl语言兼容的正则表达式,所以在编译安装nginx之前,需要安装PREC库.Nginx中Rewrite功能实现是基于ngx_http_rewrite_module,所以确保安装了此模块. Rewr

Nginx中rewrite实现二级域名、三级域名、泛域名、路径的重写

最常见的: 静态地址重定向到带参数的动态地址 rewrite "^(.*)/service/(.*)\.html$" $1/service.php?sid=$2 permanent; 反过来: 带参数的动态地址重定向到静态地址 if ($query_string ~* id=(.*)) { set $id $1; rewrite "^(.*)/article.asp$" $1/article/$id.htm last; } 泛域名解析 view plaincopy

Nginx中Rewrite规则

对rewrite来说,正则匹配不会包括hostname以及query string: 这样实现的规则其实就类似于: rewrite ^/index/([\d+])/(.*).html$ /index.php?atype=$2&user=$1 last

nginx中rewrite flag

rewrite  正则表达式  新URI  [flag]; [flag] 选项用于调控重写的行为,它的取值可能是: last:重写完成后,会停止继续处理当前区块所有属于ngx_http_rewrite_module模块的语句(即不会继续匹配当前区块余下的rewrite语句或其它属于该模块的语句).重写得到的新URL会重新匹配所有location语句,以进行进一步处理. break:重写完成后,会停止继续处理当前区块所有属于ngx_http_rewrite_module模块的语句(即不会继续匹配当

Nginx中的rewrite指令

转自:http://www.76ku.cn/articles/archives/317 rewite.在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空..location中的rewirte:.不写last和break -    那么流程就是依次执行这些rewriterewrite break -        url重写后,直接

Nginx中的rewrite指令(break,last,redirect,permanent)

rewite 在server块下,会优先执行rewrite部分,然后才会去匹配location块 server中的rewrite break和last没什么区别,都会去匹配location,所以没必要用last再发起新的请求,可以留空 location中的rewirte: 不写last和break - 那么流程就是依次执行这些rewrite 1. rewrite break url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变 2. rewrite

nginx之rewrite相关功能

Nginx Rewrite相关功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,nginx的正则表达式底层依赖于PCRE库,PCRE是用perl语言写的:rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也

CentOS6.5 下在Nginx中添加SSL证书以支持HTTPS协议访问

参考文献: 1. NginxV1.8.0安装与配置 2. CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问 3. nginx配置ssl证书的方法 4.nginx强制使用https访问(http跳转到https) 5.nginx ssl 107 (net::ERR_SSL_PROTOCOL_ERROR) 无法与服务器建立安全连接 解决方法 配置过程如下: 我的nginx是 yum 安装 具体安装过程参考:[转]CENTOS 6.5 配置YUM安装NGINX+服务器负载均衡 一.安

Nginx的Rewrite规则与实例

通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令. rewrite 语法: rewrite regex replacement [flag]; 默认值: — 上下文: server, location, if 如果指定的正则表达式能匹配URI,此URI将被r