Nginx的rewrite规则

实现url重写一级重定向

使用场景:

1、URL访问跳转,支持开发设计

    页面跳转、兼容性支持、展示效果

2、SEO优化

3、维护

    后台维护、流量转发等

4、安全

配置语法:

Syntax: rewrite regex replacement
Default: -
Context: server,location,if

rewrite ^(.*)$ /pages/maintain.html break;

正则表达式

. 匹配除换行符意外的任意字符
? 重复0次或1次
+ 重复一次或更多次
* 最少链接数,那个机器连接数少就分发
\d 匹配数字
^ 匹配字符串的开始
$ 匹配字符串的介绍
{n} 重复n次
{n,} 重复n次或更多次
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母的任意一个

()用于匹配括号之间的内容 通过$1、$2调用

if ($hrrp_user_agent ~ MSIE){

  rewite ^(.*)$ /msie/$1 break;
}

flag

Rewrite规则优先级

  执行server块的rewritr指令

  执行location匹配

  执行选定的location中的rewrite 

Nginx 和 GeoIP 模块读取IP所在的地域信息

yum install nginx-module-geoip

http_geoip_module使用场景

一、区别国内外作HTTP访问规则
二、区别国内城市地域作HTTP访问规则
yum 安装好后找到安装的模块文件
如果nginx是用yun安装的一般是安装到 /etc/nginx/modules/目录下
注意:如果nginx不是yum安装的而是源码编译安装的需要从新安装编译一次nginx加上此模块,然后就不用手动加入此模块了。

手动加入模块

在nginx.conf配置文件的头部载入模块和http是同一个级别的

load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so";

因为GeoIP是基于MaxMind 提供了数据库文件来读取地域信息的所以需要下载ip的地域文件。
这个数据库是二进制的,不能用文本编辑器打开,需要上面的 GeoIP 库来读取。

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz  #国家的地域IP
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz #城市的地域IP

然后解压

load_module "modules/ngx_http_geoip_module.so";
load_module "modules/ngx_stream_geoip_module.so"; ....... http{
geoip_country /etc/nginx/geoip/GeoIP.dat; #加载国家IP
geoip_city /etc/nginx/geoip/GeoLiteCity.dat; #加载城市IP ......... server
{
......
location / {
#判断如果不是中国的就返回403;
if ($geoip_country_code != CN) {
return 403;
}
}
#返回国家城市信息
location /myip {
default_type text/plain;
return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
} ....
}
}

然后访问 你的IP地址/myip 就可以返回IP所在的国家城市信息了。

使用nginx secure_link指令实现下载防盗链

一、安装nginx并检查是否已安装模块

[root@img_server ~]# nginx -V #输出nginx所有已安装模块,检查是否有ngx_http_secure_link_module

二、配置nginx

[root@img_server ~]# vim /etc/nginx/conf.d/dowm_img_safe.conf
server {
listen 80;
server_name img_server;
root /usr/share/nginx/html/; location / {
secure_link $arg_md5,$arg_expires; #这里配置了2个参数一个是arg_md5,一个是arg_expires
secure_link_md5 "$secure_link_expires$uri secret_key"; #secret_key为自定义的加密串
if ($secure_link = "") {
return 403; #资源不存在或哈希比对失败
}
if ($secure_link = "0") {
return 403; #时间戳过期
}
if ($request_filename ~* ^.*?\.(jpg)$){
add_header Content-Disposition attachment; #不浏览,直接下载
}
} }

三、使用shell脚本生成下载的链接(生产环境由开发在代码中实现)

[root@img_server html]# cat md5url.sh
#!/bin/bash
servername="img_server" #服务器的域名
download_file="/test.jpg" #测试下载文件的uri
time_num=$(date -d "+300 seconds" +%s) #定义过期时间为300秒
secret_num="secret_key" #自定义的加密串,和nginx的配置文件中加密串相同
res=$(echo -n "${time_num}${download_file} ${secret_num}"|openssl md5 -binary|openssl base64|tr +/ -_|tr -d =) #生成MD5值
echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}" #打印下载链接

四、测试

[root@img_server html]# chmod +x md5url.sh  #添加权限
[root@img_server html]# systemctl start nginx #启动服务
[root@img_server html]# wget http://pic17.huitu.com/res/20140314/526868_20140314230121822200_1.jpg
[root@img_server html]# mv 526868_20140314230121822200_1.jpg test.jpg #下载一个图片,并命名为test.jpg

1.测试直接访问(测试机器需要添加域名解析)

访问结果为403

2.使用生成的下载链接进行访问

过五分钟(即脚本中300秒)再次访问,返回410

注意事项

1 密钥防止泄露、以及经常更新密钥
2 下载服务器和链接生成的服务器上的时间不能相差太大,否则容易出现文件一直都是过期状态.

Nginx高级模块学习的更多相关文章

  1. Nginx相关模块学习使用实践指南

    转载自:https://www.bilibili.com/read/cv16150654?spm_id_from=333.999.0.0 0x01 Nginx 常用模块使用实践 官方模块使用手册:ht ...

  2. Nginx 高级配置-第三方模块编译

    Nginx 高级配置-第三方模块编译 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 第三模块是对nginx 的功能扩展,第三方模块需要在编译安装Nginx 的时候使用参数--add ...

  3. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  4. nginx源码学习资源(不断更新)

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  5. nginx源码学习资源

    http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源 ...

  6. Nginx限速模块初探

    Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟.我们会通过一些简单的示例展示Nginx限速模块是如何工作 ...

  7. [转帖]Nginx rewrite模块深入浅出详解

    Nginx rewrite模块深入浅出详解 https://www.cnblogs.com/beyang/p/7832460.html rewrite模块(ngx_http_rewrite_modul ...

  8. Python 日期时间处理模块学习笔记

    来自:标点符的<Python 日期时间处理模块学习笔记> Python的时间处理模块在日常的使用中用的不是非常的多,但是使用的时候基本上都是要查资料,还是有些麻烦的,梳理下,便于以后方便的 ...

  9. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

随机推荐

  1. JUC之Lock接口以及Synchronized回顾

    Lock接口 Synchronized关键字回顾: 多线程编程步骤(上): 创建资源类,在资源类创建属性和操作方法 创建多个线程,调用资源类的操作方法 创建线程的四种方式: 继承Thread 实现Ru ...

  2. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  3. CF1154A Restoring Three Numbers 题解

    Content 已知有三个正整数 \(a,b,c\),现在给出 \(a+b,a+c,b+c,a+b+c\)(不保证有序)的值,试求出 \(a,b,c\). 数据范围:\(2\leqslant a+b, ...

  4. java 常用类库:时间类LocalDate;LocalTime;LocalDateTime;Calendar 类;Date ;

    LocalDate类 LocalDate类代表不带时区的日期,列入2020-12-20.该类提供了静态的now()方法来获取当前的日期.这个类是线程安全的. LocalTime类 代表不带时区的时间, ...

  5. jackson-databind-2.2.3.jar,ackson-annotations-2.2.3.jar和jackson-core-2.2.3.jar下载

    jackson包开发下载,包括如下3个jar文件 jackson-databind-2.2.3.jar,还需要jackson-annotations-2.2.3.jar和jackson-core-2. ...

  6. 在Winform项目和Web API的.NetCore项目中使用Serilog 来记录日志信息

    在我们常规的调试或者测试的时候,喜欢把一些测试信息打印在控制台或者记录在文件中,对于.netframework项目来说,我们输出控制台的日志信息习惯的用Console.WriteLine来输出查看,不 ...

  7. 最强最全面的大数据SQL经典面试题(由31位大佬共同协作完成)

    本套SQL题的答案是由许多小伙伴共同贡献的,1+1的力量是远远大于2的,有不少题目都采用了非常巧妙的解法,也有不少题目有多种解法.本套大数据SQL题不仅题目丰富多样,答案更是精彩绝伦! 注:以下参考答 ...

  8. [WPF] 实现 WPF 的 Inner Shadow

    在 WPF 中,我们通常用 DropShadow 做阴影效果,但都是做外阴影.内阴影(Inner Shadow)的话其实也不是不可以,就是有些曲折.这篇文章介绍几种做内引用的做法. 文章涉及到以下概念 ...

  9. MySQL 报错:[Err] 1071 - Specified key was too long; max key length is 767 bytes

    [Err] 1071 - Specified key was too long; max key length is 767 bytes 这个会出现在MySQ5.7以下版本 因为没有启用innodb_ ...

  10. JAVA获取多个经纬度的中心点

    import java.util.LinkedList; public class Test1 { /** * 位置实体类,根据自己的来即可 */ static class Position{ /** ...