nginx rewrite实战

nginx rewrite实战

nginx rewrite实战

前言

      Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用(当然并不是说不改动任
何东西就拿来使用)。 

          比如在Apache中这样写规则 rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last; 而在Nginx中写
成这样写是无法启动的,解决的办法是加上两个双引号: rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1  
last;一般来说,nginx的rewrite规则可以写在nginx配置文件中的location {}中,也可以针对特定的目录进行location \demo {},这个实例就是针对服务器根目录下的demo目录的rewrite规则配置等等; nginx的rewrite重写是基于pcre库匹配的,所以会牵涉到一些基本的nginx匹配规则: 

实战演示

nginx rewrite 正则表达式匹配

  • 大小写匹配

    1. ~ 为区分大小写匹配

    2. ~* 为不区分大小写匹配

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

  • 文件及目录匹配

    1. -f 和!-f用来判断文件时否存在

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

    3. -e和!-e用来表示是否存在文件或者目录

    4. -x和!-x用来表示文件是否可执行

  • flag标记

    1. last 相当于Apache里的[L]标记,表示完成rewrite

    2. break 终止匹配, 不再匹配后面的规则。

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

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

  • 一些可用的全局变量

1. $remote_addr        //获取客户端ip
2. $binary_remote_addr //客户端ip(二进制)
3. $remote_port        //客户端port,如:50472
4. $remote_user        //已经经过Auth Basic Module验证的用户名
5. $host           //请求主机头字段,否则为服务器名称,如:blog.sakmon.com
6. $request        //用户请求信息,如:GET ?a=1&b=2 HTTP/1.1
7. $request_filename   //当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html
8. $status         //请求的响应状态码,如:200
9. $body_bytes_sent        // 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40
10. $content_length        // 等于请求行的“Content_Length”的值
11. $content_type          // 等于请求行的“Content_Type”的值
12. $http_referer          // 引用地址
13. $http_user_agent      // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
14. $args                        //与\$query_string相同 等于当中URL的参数(GET),如a=1&b=2
15. $document_uri        //与\$uri相同  这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html
16. $document_root       //针对当前请求的根路径设置值
17. $hostname        //如:centos53.localdomain
18. $http_cookie        //客户端cookie信息
19. $cookie_COOKIE      //cookie COOKIE变量的值
20. $is_args                   //如果有$args参数,这个变量等于”?”,否则等于”",空值,如?
21. $limit_rate //这个变量可以限制连接速率,0表示不限速
22. $query_string          // 与$args相同 等于当中URL的参数(GET),如a=1&b=2
23. $request_body      // 记录POST过来的数据信息
24. $request_body_file  //客户端请求主体信息的临时文件名
25. $request_method       //客户端请求的动作,通常为GET或POST,如:GET
26. $request_uri          //包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2
27. $scheme            //HTTP方法(如http,https),如:http
28. $uri            //这个变量指当前的请求URI,不包括任何参数(见\$args) 如:/2013/81.html
29. $request_completion //如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK
30. $server_protocol    //请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1
31. $server_addr        //服务器IP地址,在完成一次系统调用后可以确定这个值
32. $server_name        //服务器名称,如:blog.sakmon.com
33. $server_port        //请求到达服务器的端口号,如:80

多目录转成参数

要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)\.domain\.com) { 
   set $sub_name $1;
   rewrite ^/sort\/(\d+)\/?\$ /index.php?act=sort&cid=$sub_name&id=$1 last;
}  

目录对换

要求:/123456/xxxx -> /xxxx?id=123456

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
  • 再来一个针对浏览器优化的自动rewrite,这里rewrite后的目录可以是存在的
    例如设定nginx在用户使用IE浏览器的使用重定向到/nginx-IE目录
    规则如下:

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /nginx-ie/$1 break;
}

目录自动加“/” ,这个功能一般浏览器自动完成

if (-d $request_filename){ 
   rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
}

禁止htaccess

location ~/\.ht { 
   deny all;
}

禁止多个目录

location ~ ^/(cron|templates)/ { 
   deny all; break;
}

禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求

location ~ ^/data {
   deny all;
}

禁止单个文件

location ~ /data/sql/data.sql { 
   deny all;
}

给favicon.ico和robots.txt设置过期时间; 这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) { 
   log_not_found off;
   expires 99d;
   break;
}
location ~(robots.txt) {
   log_not_found off;
   expires 7d;
   break;
}

设定某个文件的浏览器缓存过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js { 
   access_log off;
   expires 600;
   break;
}

文件反盗链并设置过期时间–<盗链多次请求也会打开你的站点的图片啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图片>

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 
   valid_referers none blocked *.jjonline.cn *.jjonline.com.cn *.lanwei.org *.jjonline.org localhost  42.121.107.189;
   if ($invalid_referer) {
       rewrite ^/ http://img.jjonline.cn/forbid.gif;
       return 417;
       break;
   }
   access_log off;
   break;
}

说明:

这里的return 417 为自定义的http状态码,默认为403,方便通过nginx的log文件找出正确的盗链的请求地址  
   “rewrite ^/ http://img.jjonline.cn/forbid.gif;”显示一张防盗链图片
    “access_log off;”不记录访问日志,减轻压力  
   “expires 3d”所有文件3天的浏览器缓存

  • 只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行

location \ { 
   allow 22.27.164.25; #允许的ip
   deny all;
   auth_basic “KEY”; #认证的一些设置
   auth_basic_user_file htpasswd;
}

说明:location的应用也有各种变化,这里的写法就针对了根目录了。

文件和目录不存在的时重定向

if (!-e $request_filename) {
   #proxy_pass http://127.0.0.1; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器
   rewrite ^/ http://www.jjonline.cn/none.html;  #跳转到这个网页去
   #return 404; #直接返回404码,然后会寻找root指定的404.html文件
}

域名跳转

server { 
   listen 80;
   server_name jump.jjonline.cn ;#需要跳转的多级域名
   index index.html index.htm index.php; #入口索引文件的名字
   root /var/www/public_html/; #这个站点的根目录
   rewrite ^/ http://www.jjonline.cn/;
   #rewrite到这个地址,功能表现:在浏览器上输入jump.jjonline.cn并回车,不会有任何提示直接变成www.jjonline.cn
   access_log off;
}

多域名转向

server { 
   listen 80;
   server_name www.jjonline.cn www.jjonline.org;
   index index.html index.htm index.php;
   root /var/www/public_html/;
   if ($host ~ “jjonline\.org”) {
       rewrite ^(.*) http://www.jjonline.cn$1 permanent;
   }
}

三级域名跳转

if ($http_host ~* “^(.*)\.i\.jjonline\.cn$”) { 
   rewrite ^(.*) http://demo.jjonline.cn$1;
   break;
}

域名镜向

server { 
   listen 80;
   server_name mirror.jjonline.cn;
   index index.html index.htm index.php;
   root /var/www/public_html;
   rewrite ^/(.*) http://www.jjonline.cn/$1 last;
   access_log off;
}

某个子目录作镜向,这里的示例是demo子目录

location ^~ /demo {
   rewrite ^.+ http://demo.jjonline.cn/ last;
   break;
}

请求URI不存在的重写方法

location ~ {
   if (!-e $request_filename) {
          rewrite ^/(.+)$ /index.php last;
   }
}

原创文章,作者:wanghui,如若转载,请注明出处:http://www.178linux.com/59542

(1)
wanghuiwanghui
上一篇 2016-11-17
下一篇 2016-11-17

相关推荐

  • 用户相关属性权限、正则表达式的应用(网络班21期第四周博客)

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。          mkdir /home/tuser1        &n…

    Linux干货 2016-08-02
  • 正则表达式简述

    正则表达式简述 什么是正则表达式: 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 正则表达式分类: 标准正…

    Linux干货 2016-04-05
  • CentOS6 ELK实现

    1 简介 我们来介绍Centos6.5基于SSL密码认证部署ELK(Elasticsearch 1.4.4+Logstash 1.4.2+kibana3),同时为大家介绍如何集合如上组件来收集日志,本章的日志收集主要为大家介绍SYSTEM日志收集. 集中化日志收集主要应用场景是在同一个窗口临时性或永久性鉴定分析系统,应用等各类日志,对用户提供极大便…

    Linux干货 2017-05-17
  • 优云老王(三)谈埋点:人生处处有埋点

    说到埋点,的确是用户最感兴趣的话题之一,优云Web产品在内测阶段便收到了用户的各种反馈,反复问我无码埋点是怎么做的。在此我专门与大家聊聊埋点以及各种实现方案的利弊。 1、埋点的来历 先说下埋点的来历,其实在互联网没流行起来之前,埋点并不是用来分析用户行为的,技术人员为了解决某些问题,就在代码里面加入了些行为逻辑代码,如果用户使用产品的过程中出了问题,就生成一…

    2016-09-19
  • 如何练好yum的一招一式

      工作时间越久,就越有这样一个深刻体会,一个新知识或者新的技能一个人学习起来并不会觉得吃力,反而要想把你学习的新知识或者新技能给讲清楚让普通人听得懂才是最难的,之前我写过一篇博客讲述linux下的RPM包管理器,今天写的练好yum的一招一式,同样都是都是在linux系统的软件包的安装、卸载、升级等功能的,为什么我们还需要yum那,记得一位大哲学家…

    Linux干货 2015-11-10
  • 8.3号,第6天

    三种权限rwx对文件和目录的不同意义: 权限对于目录的意义: 1,r权限:拥有此权限表示可以读取目录结构列表,也就是说可以查看目录下的文件名和子目录名,注意:仅仅指的是名字。 2、w权限:拥有此权限表示具有更改该目录结构列表的权限,总之,目录的w权限与该目录下的文件名或子目录名的变动有关,注意:指的是名字。具体如下:      …

    Linux干货 2016-08-05