在有些情况下我们需要对我们服务器上的资源进行加密访问,那么我们需要如何来实现呢?
1. 修改nginx配置
修改nginx配置,将需要加密访问的资源设置为禁止外部访问
# 资源真实存储路径 /upload 禁止外部直接访问 location ^~ /upload { internal; }
设置访问不存在资源时,跳转到指定的php脚本进行解析
# 如果文件不存在,则rewrite到PHP脚本文件进行处理 if (!-f $request_filename) { rewrite ^/.*$ /attachment.php; }
根据如上配置nginx实现资源加密访问实例
# 图片真实存储路径 /upload 禁止外部直接访问 location ^~ /upload/school { internal; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { # 如果文件不存在,则rewrite到PHP脚本文件进行处理 if (!-f $request_filename) { rewrite ^/.*$ /attachment.php; } expires 30d; error_log /dev/null; access_log /dev/null; }
2. attachment.php(资源解析脚本)
<?php // key参数为校验参数,有该参数即可通过验证,否则不通过 if (!isset($_GET['key'])) { exit('get img failed!'); } //key验证逻辑 $imagePath = $_SERVER['DOCUMENT_ROOT'] . '/upload/'; $image = $_SERVER['REQUEST_URI']; // 拼接图片真实全路径 $fullPath = $imagePath . $image; // 获取图片mime信息 设置Content-type头 $mime = getimagesize($fullPath)['mime']; header("Content-Type: $mime"); // 设置sendfile头部,让nginx跳转到download下查找对应图片 相当于交给nginx进行后续处理 header("X-Accel-Redirect: /upload/$image"); die;
- 根据如上就可以实现资源机密访问,最总实现效果如下(站点域名为:www.test.com)
-- 例如资源真实地址为:/upload/test.jpg
-- 访问 www.test.com/upload/test.jpg 失败
-- 访问 www.test.com/test.jpg 失败
-- 访问 www.test.com/test.jpg?key=XXX 成功
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。