nginx复习007 重写重定向+防盗链+https配置

—–重写与重定向

1> 问题的提出
修改了网站的结构与域名 会出现的问题
a.可能会造成网站中的链接或在其他网站中的外链失效
b.影响该网站在搜索引擎的收录量和排名
解决办法:
通常采用url重写与重定向 在增强网站专业化的同时,为用户提供更加舒适的使用体验

2> nginx提供的rewrite模块
rewrite指令 + nginx提供的全局变量/自定义的变量 + 结合正则表达式 + 标识(last break redirect permanent)

3> 什么是重写
url地址不变,将其他地址中的内容显示到当前请求的url地址中
比如:http://www.baicai.com/test.php(当前请求) 重写到 http://www.baicai.com/index.html(其他地址)
4> 什么是重定向
请求的url地址,按照设置的规则显示,请求内容不变
比如:http://www.baicai.com/img-2.jpg 重定向到 http://www.baicai.com/img/2.jpg

–rewrite重写的语法
rewrite regex replacement [flag]
符合rewrite编写的regex正则语法规则,就执行相应的replacement替换算法
可选参数flag指定进一步处理的标识:
last 终止rewrite 继续匹配其他规则
break 终止rewrite 不再继续匹配

–rewrite重写的实现

server { 
    listen 80; 
    server_name test.ng.test; 
    index index.html index.htm;
    root html;
    if ( !-e $request_filename ) {
        rewrite "^/.*" /default/default.html break;
    }
}

!-e 请求的文件或目录不存在的时候就为真
–if详情看手册
http://nginx.org/en/docs/

–break和last标识符的区别
last: 重写后停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行
break:相对last,break并不会重新发起一个请求,跳出rewrite后,并执行本请求后续的代码

server {
    listen 80; 
    server_name test.ng.test; 
    root html;
    location /break/ {
        rewrite ^/break/(.*) /test/$1 break;
        echo "break page";
    }
    location /last/ {
        rewrite ^/last/(.*) /test/$1 last;
        echo "last page";
    }
    location /test/ {
        echo "test page";
    }
}

更难的挑战
https://blog.csdn.net/shermy/article/details/6367656

–rewrite重定向语法
rewrite regex replacement [flag]
符合rewrite编写的regex正则语法规则,就执行相应的replacement替换算法
可选参数flag指定进一步处理的标识:
redirect 返回的http状态码是302(临时重定向),使得搜索引擎在抓取新的内容的同时保留旧的网址
permanent 返回的http状态码是301(永久重定向),使得搜索引擎在抓取新的内容的同时也将旧的地址永久替换为重定向的网址

从实现功能的角度上去看,redirect 和 permanent 是一样的。不存在好坏,也不存在什么性能上的问题, 但是对seo会有影响,这里要根据需要做出选择

–rewrite重定向实现

server {
    listen 80; 
    server_name test.ng.test; 
    root html;
    set $name $1;
    rewrite ^/img-([0-9]+).jpg$ /img/$1.jpg permanent; 
}

—–防盗链配置

–什么是盗链
盗链是指有一些不良网站,为了在不增加成本的前提下扩充自己的站点的内容,直接盗用其他网站的资源链接,而大部分用户又不会发现

–盗链的危害
一方面损害原网站的合法利益
另一方面又加重原网站服务器的流量负担

–常见的盗链
盗取图片 盗取下载地址等

–防盗链的方法
1> 图片防盗链 最简单的防护手段就是判断referer的值
2> 下载防盗链 ng_http_secure_link_module模块

–图片防盗链配置
涉及的指令 valid_referers

location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers  www.ng.test ng.test;
    if ($invalid_referer) {
        return 403;
     }
}

–需要注意的是,不是所有的浏览器都会发送referer请求头,并且referer的值还可以被客户端随意修改,也就是说,referer是可以被伪造的,因此,上述讲解的方式只能用于防范普通用户对图片资源的盗用

–下载防盗链的配置
使用ng_http_secure_link_module模块
–对于图片之外的下载资源,如果不需要考虑资源链接的长期有效性,可以使用nginx中ng_http_secure_link_module模块提供的secure_link和secure_link_md5指令来实现下载地址的加密和时效性
1>重新编译
–with-http_secure_link_module
2>实现原理
首先服务器端根据特定规则对下载地址进行加密,
然后在用户请求下载链接时,验证加密链接是否有效,防止用户伪造下载链接,
同时为了避免加密后的链接被盗链,在加密时添加过期时间,使得下载地址只在一定时间内有效,过期后只能到原网站获取新的地址.

<?php
// 自定义密钥
$secret = 'ng.test'; 
// 下载文件路径
$path = '/down/web/nginx-1.10.1.tar.gz'; 
// 生成过期时间,time()是当前时间,60表示60秒,即从现在到60秒之内不过期
$expire = time()+60;
// 用文件路径、密钥、过期时间生成加密串
$md5 = base64_encode(md5($secret.$path.$expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
// 生成加密后的下载文件链接
echo '<a href="http://www.ng.test/down/web/nginx-1.10.1.tar.gz?st='.$md5.'&e='.
$expire.'">nginx-1.10.1</a>';
// 输出加密后的下载地址 
echo '<br>http://www.ng.test/down/web/nginx-1.10.1.tar.gz?st='.$md5.'&e='.$expire;
?>
location / {
    secure_link $arg_st,$arg_e;
    secure_link_md5 ng.test$uri$arg_e;
    if ($secure_link = "") { 
        return 403;
    }
    if ($secure_link = "0") { 
        return 403;
    }
}

–同步时间
–密钥要一样

—–配置https

–获取认证证书(专业ca机构颁发 或者 使用openssl开源软件将自己作为ca颁发)
https://linuxstory.org/deploy-lets-encrypt-ssl-certificate-with-certbot/
https://blog.jjonline.cn/linux/221.html
https://zhangge.net/4861.html
https://zhangge.net/4890.html

–颁发认证证书
为服务器生成私钥RSA -> 生成服务器CSR证书的请求文件 -> nginx自己为自己认证

1> 生成服务器的RSA私钥
RSA是https使用的一种算法

mkdir /usr/local/nginx/conf/ssl
cd  /usr/local/nginx/conf/ssl
openssl genrsa -des3 -out server.key 2048

2> 生成服务器的CSR证书请求文件

openssl req -new -key server.key -out server.csr

req 表示证书签发申请
-new 表示新申请
-key 指定私钥
-out 表示生成的csr证书请求文件名称

3> ca机构为服务器认证证书

openssl x509 -req -days 30 -in server.csr -signkey server.key -out server.crt

x509 是自签名证书格式
-days 30 用于设置签发证书的有效期为30天

–nginx配置https网站
添加ssl模块支持 ngx_http_ssl_module模块
开放443端口

server {
    listen 443; 
    server_name www.test.com;
    root html;
    ssl on;
    ssl_certificate      /usr/local/nginx/conf/ssl/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/server.key;
}

ssl 用于开启nginx对ssl的支持
ssl_certificate 用于指定ca认证后的crt文件路径
ssl_certificate_key 用于指定服务器私钥的路径

猜你喜欢

转载自blog.csdn.net/eebaicai/article/details/81288497