基于Nginx+PHP实现的带权限验证的动态文件服务器,如某些情景须要校验参数后能力返回资源,或者缩略图生成等。
1、Nginx配置
1、动态文件存储在download中,会被设置为internal,即只能外部拜访不容许内部间接拜访
2、所有动态资源申请均打到PHP程序上,通过权限验证后能力拜访
图片实在存储门路 /download 禁止内部间接拜访
location ^~ /download { internal; # alias可选 用于额定配置理论门路,即非download目录 #alias /home/qii/imgtest/download;}# 图片文件捕捉 能够增加本人对应的动态资源后缀location ~* \.(png|jpg|jpeg|gif)$ { #如果文件不存在,则rewrite到PHP脚本文件进行解决 if (!-f $request_filename) { rewrite ^/.*$ /autoimg.php; } #如果文件存在,则设置过期工夫,实际上是在PHP脚本文件解决后交给nginx时会到此逻辑 if ( -f $request_filename ) { expires 30d; }}
2、PHP解决脚本
<?php// autoimg.php// 假如sign参数为校验参数,有该参数即可通过验证,否则不通过if (!isset($_GET['sign'])) { exit('get img failed!');}// 图片实在寄存门路$imagePath = $_SERVER['DOCUMENT_ROOT'] . '/download/';// 获取url中的图片名 如 http://localhost/111.jpg 获取值为111.jpg$image = trim(parse_url($_SERVER['REQUEST_URI'])['path'], '/');// 拼接图片实在全门路 如 /home/qii/imgtest/download/111.jpg$fullPath = $imagePath . $image;// 获取图片mime信息 设置Content-type头$mime = getimagesize($fullPath)['mime'];header("Content-Type: $mime");// 设置sendfile头部,让nginx跳转到download下查找对应图片 相当于交给nginx进行后续解决header("X-Accel-Redirect: /download/$image");
最终成果
网站根目录 /home/qii/imgtest
/home/qii/imgtest.├── autoimg.php└── download └── 111.jpg
拜访门路为 http://localhost/111.jpg?sign 胜利
拜访门路为 http://localhost/111.jpg 失败
如间接拜访 http://localhost/download/111.jpg 失败,因为download文件夹只能外部拜访
缩略图实现
<?php// 假如sign参数为校验参数,有该参数即可通过验证,否则不通过if (!isset($_GET['sign'])) { exit('get img failed!');}// 图片实在寄存门路$imagePath = $_SERVER['DOCUMENT_ROOT'] . '/download/';// 获取url中的图片名 如 http://localhost/111.jpg 获取值为111.jpg$image = trim(parse_url($_SERVER['REQUEST_URI'])['path'], '/');// 拼接图片实在全门路 如 /home/qii/imgtest/download/111.jpg$fullPath = $imagePath . $image;//////////////////////////////////// 首次拜访时,生成缩略图if (!file_exists($fullPath)) { // 依据业务逻辑生成缩略图 伪逻辑,生成后放到 $fullPath 中 file_put_contents($fullPath, 'img data...');}//////////////////////////////////// 获取图片mime信息 设置Content-type头$mime = getimagesize($fullPath)['mime'];header("Content-Type: $mime");// 设置sendfile头部,让nginx跳转到download下查找对应图片 相当于交给nginx进行后续解决header("X-Accel-Redirect: /download/$image");