Nginx rewrite

rewirte规则也称为规则重写,主要功能是实现浏览器访问 Http URL的跳转,其正
则表达式是基于Perl语言。通常而言,几乎所有的Web服务器均可以支持URL重写。
rewrite URL规则重写的用途如下
1、对搜索引擎优化( search engine optimization,SEO)友好,利于搜索引擎抓取网站页面
2、隐藏网站URL真实地址,浏览器显示更加美观;
3、网站更换新域名后,可以基于 rewrite临时重定向到其他页面。
Nginx rewrite规则使用中有3个概念,分别是 rewrite结尾标识符、 rewrite规则常用表
达式、 Nginx rewrite变量,3个概念的详解如下:
(1) Nginx rewrite结尾标识符,用于 rewrite规则末尾,表示规则的执行属性,详解如下:
last:相当于 Apache里的(L)标记,表示完成 rewrite匹配
break:本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
其中last和 break用来实现URL重写时,浏览器地址栏URL.地址不变
(2) Nginx rewrite规则常用表达式,主要用于匹配参数、字符串及过滤设置,详解如下
\ 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置

  • 匹配前面的字符零次或者多次
  • 匹配前面字符串一次或者多次
    ? 匹配前面字符串的零次或者一次
    . 匹配除“\n”之外的所有单个字符
    (pattern) 匹配括号内的pattern

(3)if指令与全局变量
1、if判断指令
语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:
当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false直接比较变量和内容时,使用=或!=
正则表达式匹配,*不区分大小写的匹配,!~区分大小写的不匹配
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
例子如下:
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^(.*) /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下

if ( h t t p c o o k i e   ∗ " i d = ( [ ; ] + ) ( ? : ; ∣ http_cookie ~* "id=([^;]+)(?:;| httpcookie "id=([;]+)(?:;)") {
set $id KaTeX parse error: Expected 'EOF', got '}' at position 5: 1; }̲ //如果cookie匹配正则…id等于正则引用部分

if ($request_method = POST) {
return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

if ( s l o w ) l i m i t r a t e 10 k ; / / 限 速 , slow) { limit_rate 10k; } //限速, slow)limitrate10k;//slow可以通过 set 指令设置

if (!-f $request_filename){
break;
proxy_pass http://127.0.0.1;
} //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查

if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

location ~* .(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if ($invalid_referer) {
return 404;
} //防盗链
}
2、全局变量
下面是可以用作if判断的全局变量
KaTeX parse error: Expected 'EOF', got '#' at position 8: 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”。
u r i : 不 带 请 求 参 数 的 当 前 U R I , uri : 不带请求参数的当前URI, uriURIuri不包含主机名,如”/foo/bar.html”。
d o c u m e n t u r i : 与 document_uri : 与 documenturiuri相同。
用如下例子做以说明
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

(4)rewrite实例
由于第一个虚拟主机里边已经配置了一些东西,为了方便起见,用nginx的第二个虚拟主机,演示rewrite的实例
1、
rewrite ^/(.) http://www.baidu.com/ permanent; # 匹配成功后跳转到百度,执行永久301跳转
server {
listen 80;
server_name www.yunwei2.com;
access_log logs/yunwei2.log;
location / {
root html/yunwei2;
index index.html index.htm;
rewrite ^/(.
) http://www.baidu.com/redirect;
}
}
2、
例子二:
server {
listen 80;
server_name www.yunwei2.com www.yunwei2.info
if(KaTeX parse error: Can't use function '\.' in math mode at position 16: host ~ yunwei2\̲.̲info){ #".“需要使用“\”转义,这里是匹配到www.web.info时
rewrite ^(.*) http://www.yunwei2.com/&1 redirect;
#永久重定向到http://www.myweb.com网址上&1是匹配的uri
}
}
其他例子:
if (KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^(.*) /msie/$1 break;
} //如果UA包含"MSIE”,rewrite请求到/msid/目录下

if ( h t t p c o o k i e   ∗ " i d = ( [ ; ] + ) ( ? : ; ∣ http_cookie ~* "id=([^;]+)(?:;| httpcookie "id=([;]+)(?:;)") {
set $id KaTeX parse error: Expected 'EOF', got '}' at position 5: 1; }̲ //如果cookie匹配正则…id等于正则引用部分

if ($request_method = POST) {
return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302

If ( s l o w ) l i m i t r a t e 10 k ; / / 限 速 , slow ) { limit_rate 10k; } //限速, slow)limitrate10k;//slow可以通过 set 指令设置

if (!-f r e q u e s t f i l e n a m e ) b r e a k ; p r o x y p a s s h t t p : / / 127.0.0.1 ; / / 如 果 请 求 的 文 件 名 不 存 在 , 则 反 向 代 理 到 l o c a l h o s t 。 这 里 的 b r e a k 也 是 停 止 r e w r i t e 检 查 i f ( request_filename){ break; proxy_pass http://127.0.0.1; } //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查 if ( requestfilename)break;proxypasshttp://127.0.0.1;//localhostbreakrewriteif(args ~ post=140){
rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值