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

Posted 王不凡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Nginx+PHP实现的带权限验证的静态文件服务器,如某些情景需要校验参数后才能返回资源,或者缩略图生成等。相关的知识,希望对你有一定的参考价值。

基于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");

以上是关于基于Nginx+PHP实现的带权限验证的静态文件服务器,如某些情景需要校验参数后才能返回资源,或者缩略图生成等。的主要内容,如果未能解决你的问题,请参考以下文章

对网站视频资源的管控-禁止通过视频的url访问视频

nginx迁移到阿里云后静态文件403错误无法访问的原因都有哪些

keepalived + nginx 实现高可用之远程面签项目

基于nginx的静态网页部署

利用神器Nginx + X-Accel,实现PHP大文件下载统计权限判断速度限制

利用神器Nginx + X-Accel,实现PHP大文件下载统计权限判断速度限制