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

本文详细介绍了网站结构与域名变更时遇到的问题及解决方案,重点阐述了URL重写与重定向的功能与实现方式,包括nginx的rewrite模块使用、语法及其在防盗链、HTTPS配置等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

—–重写与重定向

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.youkuaiyun.com/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 用于指定服务器私钥的路径

<think>好的,用户想了解如何配置Nginx实现防盗链的最佳实践。首先,我得回忆一下防盗链的基本原理。防盗链主要是防止其他网站直接链接到自己的资源,比如图片、视频等,这样会消耗自己的带宽。通常的做法是检查HTTP请求头中的Referer字段,判断请求来源是否合法。 接下来,我需要考虑Nginx中如何配置。记得Nginxngx_http_referer_module模块提供了防盗链的功能。配置应该在server或location块中使用valid_referers指令来指定合法的来源。比如,允许空Referer(直接访问)和自家域名。然后通过$invalid_referer变量判断是否无效,如果是,返回403或者重定向。 然后,用户提到最佳实践,可能需要更详细的步骤。比如,如何设置白名单,如何处理静态资源,是否需要使用错误图片替代盗链请求。另外,可能还要考虑使用secure_link模块加强安全性,或者用Lua脚本动态处理,但用户的问题可能更关注基本配置。 还要注意引用中的信息,比如引用[3]提到的动态DNS解析可能和防盗链无关,但引用[4]提到使用Lua实现资源合并,可能防盗链也可以结合Lua做更复杂的逻辑,不过用户可能只需要基础方法。 然后,需要验证配置的正确性。比如,测试不同的Referer情况,确保合法访问通过,非法被拒绝。还要考虑浏览器直接访问(无Referer)的情况,是否需要允许,比如内链图片可能允许空Referer。 另外,可能提到添加rewrite规则来重写盗链请求,比如返回一个错误图片。同时,注意配置缓存和性能影响,确保防盗链不会显著影响服务器性能。 最后,总结步骤,分点说明,确保结构清晰。可能还要提醒用户根据实际需求调整,比如允许某些合作伙伴的域名,或者使用正则表达式匹配多个子域名。</think>### Nginx防盗链配置最佳实践 **1. 基础防盗链配置** 通过`valid_referers`指令验证请求来源,在`server`或`location`块中添加: ```nginx location ~* \.(jpg|jpeg|png|gif|mp4)$ { valid_referers none blocked *.yourdomain.com server_names ~\.google\.; if ($invalid_referer) { return 403; # 或返回替代图片: rewrite ^ /anti-hotlink.jpg; } } ``` * `none`: 允许空Referer(直接访问) * `blocked`: 允许非标准Referer(如防火墙过滤后的请求) * 支持域名/正则表达式白名单[^2] **2. 进阶安全增强** ```nginx location /static/ { # 添加资源访问签名 secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } } ``` 通过时间戳+IP+密钥生成动态签名,实现临时访问链接[^3] **3. 组合防护策略** ```nginx location ~* ^/protected/ { # 第一阶段:基础Referer验证 valid_referers server_names *.trusted.com; # 第二阶段:Lua脚本动态验证 access_by_lua_block { if ngx.var.http_referer == nil then ngx.exit(403) end -- 可查询数据库进行动态验证[^5] } # 第三阶段:设置资源缓存策略 add_header Cache-Control "private"; } ``` **4. 最佳实践要点** - 对静态资源设置`expires`头减少盗链价值 - 使用`map`指令创建多级防盗规则: ```nginx map $http_referer $bad_referer { hostnames; default 0; *.spammer.com 1; ~.xxx. 1; } ``` - 重要资源建议开启HTTPS+防盗链双重防护 - 定期分析日志优化白名单: ```bash awk '{print $11}' access.log | grep -v "-" | sort | uniq -c | sort -nr ``` **5. 测试验证方法** ```bash # 模拟合法访问 curl -I -H "Referer: https://www.yourdomain.com" http://cdn.example.com/image.jpg # 模拟非法访问 curl -I -H "Referer: https://www.pirate.com" http://cdn.example.com/image.jpg ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值