Nginx的重写规则,依赖于pcre库(perl compatible regular expression)。所以在安装的时候一定要让nginx支持这个功能,以及安装pcre-devel,prce.

nginx rewrite 正则表达式匹配

大小写匹配

~ 为区分大小写匹配

~* 为不区分大小写匹配

!~和!~*分别为 区分大小写但不匹配 及 不区分大小写但不匹配

^~ URI    不使用正则匹配,可用使用元字符匹配

文件及目录匹配

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

flag标记

last本次重写完成之后,重启下一轮检查 a[test]->a[test] ,注意如果重写规则的uri中和本段的location中uri有重复,则注意避免死循环,死循环10次后会返回500错误。

break 终止匹配, 不再匹配本段的内容。a[test]->b[test] completed!

redirect 返回302临时重定向 地址栏会显示跳转后的地址。

permanent 返回301永久重定向 地址栏会显示跳转后的地址。

break和last区别举例:

####

server {

...

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;

rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;

return 403;                #本段中location中匹配的内容和重写规则中没有重复的

...

}

But if these directives are put inside the "/download/" location, the last flag should be replaced by break, or otherwise nginx will make 10 cycles and return the 500 error:

location /download/ {

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;

rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;

return 403;

}

#####

if指定的使用:格式和c语言相同,

if (condition){

rewrite …

}

注意这里的if不支持嵌套,也不支持&& 和 ||逻辑判断

set 使用:set var $avg

rewrite_log:默认off,如果为on话,会以notic级别记录到error.log

一些例子:

  1. http转https:rewrite ^(.*) https://www.wxl.com$1 permanent;
  2. 域名跳转,将bbsX.wxl.com 转到http://www.baidu.com

  location / {

  root html;

  index index.html index.htm;

  if ($host ~ '^bbs\d{1}\.wxl\.com'){

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

    }

  }

  3.文件读写分离:文件上传的WebDav,基于http1.1协议,扩展了http1.1,在GET,POST,HEAD的其他功能,在我们作实验的时候,可以使用Apache打开Dav On

  location / {

   proxy_pass http://read_upstream;

  if ($request_method = "PUT"){

   proxy_pass http://write_upsteam;

  }

}

4. 目录自动添加/,这个功能一般浏览器自动完成.如果使用index.html在二级目录下,比如/data/bbs/index.html,如果输入/data/bbs浏览器不会跳转到主页面index.html

  location ^~ /bbs {

  if (-d $request_filename){

  rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

  }

  }

  5. 目录合并

  如果uri中有很多目录的话,将不利于搜索引擎的搜索,通过重写规则可以让uri目录看起来很少。  

  rewrite ^/server-([0-9]+)/ -([0-9]+)/ -([0-9]+)/ -([0-9]+)/\.html$ /server/$1/$2/$3/$4.html last;

  break;

  这样地址栏输入http://www.wxl-dede.com/server-12-12-12-12.html,

  实际访问的是http://www.wxl-dede.com/server/12/12/12/12.html

  6.禁止访问某个目录

  location ~ ^/(cron|templates)/ {

  deny all; break;

  }

7. 针对不同浏览器访问不同的内容

  if ($http_user_agent ~ Chrome){

  rewrite ^(.*)$ /data/index.html break;

  }

8. 自定义某一类型的文件的保质期时间

  location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {

  if (-f $request_filename) {

  expires 1h;

  break;

  }

  }

Nginx防盗链

盗链的概念,自己网站不存在的资源,链接到其他网站的资源。但对其他网站会造成额外的消耗,unfair。

在http的请求头部中refrer头域中的值记录访问目标的源地址,因此在nginx中可以通过制定合法的URL,来防止防盗链。

语法: valid_referers none | blocked | server_names | string …;

none    来源头部为空的情况

blocked    防火墙删除了http://或者 https://

server_names    制定特定的主机,支持匹配符,支持正则

例子:基于资源的防盗链

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

valid_referers none blocked *.wxl.com;

if ($invalid_referer) {

return 403;

rewrite ^/ http://img.jjonline.cn/forbid.gif;

break;

}

对jpg,jpeg等资源进行防止盗链。

当然也可以基于目录

root /server/file/;

valid_referers none blocked *.wxl.com;

if ($invalid_referer) {

return 403;

rewrite ^/ http://img.jjonline.cn/forbid.gif;

break;

}

Nginx重写规则的更多相关文章

  1. Nginx重写规则指南 转

    http://www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ Nginx重写规则指南 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你, ...

  2. 基础知识之nginx重写规则

    nginx重写规则 nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 -f ...

  3. Nginx 重写规则指南1

    作者:运维生存时间 - 默北 链接:www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...

  4. Nginx 重写规则指南

    作者:运维生存时间 - 默北 链接:www.ttlsa.com/nginx/nginx-rewriting-rules-guide/ 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...

  5. nginx重写规则报nginx: [emerg] directive "rewrite" is not terminated by ";"

    对于下面的重写规则 rewrite ^/gongying/([\d]{8})_([\d]+).html$ /index.php?app=support&act=view&pts=$1& ...

  6. Laravel的Nginx重写规则完整代码

    laravel基本重写规则 location / { index index.html index.htm index.php; try_files $uri $uri/ /index.php?$qu ...

  7. nginx重写规则配置

    https://segmentfault.com/a/1190000002797606 location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符 ...

  8. thinkphp5.0配置nginx重写规则

    我的centeros7.3系统,单主机实例: vi /usr/local/nginx/conf/nginx.conf 在如图红框位置加入以下代码(图片是截取的,截取部分上方还有其他的默认配置代码,代码 ...

  9. Nginx笔记总结十一:Nginx重写规则指南

    依赖PCRE库,需要安装pcre,最多循环10次,超过后返回500错误, 1.       rewrite模块指令 break:完成当前设置的重写规则,停止执行其他的重写规则 if:  if () { ...

随机推荐

  1. sqlldr trailing nullcols

    由于要导入到tmp_content表的一些列(列:要导入的源文件txt or csv文件)为空,也,按理讲我当时另存为(在windows处理)csv,以,分隔.就是这个列没有内容,也该显示, ,之类的 ...

  2. HDU 6114 Chess 【组合数】(2017"百度之星"程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. 迭代器模式(Iterator.hasNaxt())

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. ...

  4. Android ADB实现解析【转】

    本文转载自:http://blog.csdn.net/u010223349/article/details/41120255   ADB是Android系统提供的调试工具,整个ADB工具由三部分组成: ...

  5. 前端如何展示商品属性:SKU多维属性状态判断算法的应用-Vue 实现

    由于公司开发了一个电商项目,涉及到前台商品属性的展示,所以百度上找了一下!找到了 周琪力写的一个算法例子,因为作者只有jQuery 实现demo, 自己仿照 demo 实现了一个 vue 的! 周琪力 ...

  6. codeforces B. Shower Line 解题报告

    题目链接:http://codeforces.com/contest/431/problem/B 题目意思:给出5 * 5 的矩阵.从这个矩阵中选出合理的安排次序,使得happiness之和最大.当第 ...

  7. MyBatis学习 之 四、动态SQL语句

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...

  8. 「HAOI2015」「LuoguP3178」树上操作(树链剖分

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  9. 特殊的shell变量:

    特殊的shell变量: $0 获取当前执行的shell脚本的文件名 $n 获取当前执行的shell脚本的第n个参数值,n=1..9 $* 获取当前shell的所有参数 “$1 $2 $3 …注意与$# ...

  10. 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP

    题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个“承诺”,只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. 代码如下: #inc ...