乐趣区

关于php:基于NginxPHP实现的带权限验证的静态文件服务器如某些情景需要校验参数后才能返回资源或者缩略图生成等

基于 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");
退出移动版