You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Secure Link模块,Nginx实现MD5哈希图片路径的方案求助

替代Secure Link的MD5哈希路径实现方案

方案1:利用Nginx Lua模块(OpenResty推荐)

如果能部署OpenResty(自带Lua模块)或给现有Nginx添加Lua模块,这是最灵活的方案。核心逻辑是解析请求中的MD5哈希段,映射回原数字路径,可选验证哈希合法性防止非法访问。

示例配置:

server {
    server_name localhost;

    location ~* ^/catalog/([a-f0-9]{32})/([a-f0-9]{32})/(\d+\.(png|ico|gif|jpg|jpeg))$ {
        set $secret_key "your_custom_secret";
        
        access_by_lua_block {
            local hash1 = ngx.var[1]
            local hash2 = ngx.var[2]
            local secret = ngx.var.secret_key
            
            # 示例:假设哈希是「数字+密钥」的MD5,验证哈希是否匹配原数字1
            local expected_hash1 = ngx.md5("1" .. secret)
            local expected_hash2 = ngx.md5("1" .. secret)
            
            if hash1 ~= expected_hash1 or hash2 ~= expected_hash2 then
                ngx.exit(403)
            end
            
            # 验证通过后设置真实路径变量
            ngx.var.real_path1 = "/1"
            ngx.var.real_path2 = "/1"
        }
        
        alias /catalog$real_path1$real_path2/$3;
    }
}

说明:实际场景中,需维护哈希与原数字的映射(比如用Redis存储或读取配置文件);若无需验证哈希,直接根据哈希映射到对应数字路径即可。

方案2:使用ngx_http_set_misc_module模块

该模块提供set_md5等哈希指令,编译难度低于Secure Link模块(源码编译Nginx时添加模块即可)。

示例配置:

server {
    server_name localhost;
    set $secret "your_secret_key";

    location ~* ^/catalog/([a-f0-9]{32})/([a-f0-9]{32})/(\d+\.(png|ico|gif|jpg|jpeg))$ {
        # 验证第一个哈希是否对应数字1的MD5(带密钥)
        set $expected_hash1 $secret;
        set $expected_hash1 "${expected_hash1}1";
        set_md5 $expected_hash1 $expected_hash1;
        
        if ($1 != $expected_hash1) {
            return 403;
        }
        
        # 同理验证第二个哈希
        set $expected_hash2 $secret;
        set $expected_hash2 "${expected_hash2}1";
        set_md5 $expected_hash2 $expected_hash2;
        
        if ($2 != $expected_hash2) {
            return 403;
        }
        
        alias /catalog/1/1/$3;
    }
}

说明:编译时需添加模块,命令示例:./configure --add-module=path/to/ngx_http_set_misc_module && make && make install;适合哈希规则固定、数字范围不大的场景。

方案3:静态映射配置(适合少量固定路径)

若数字段数量不多,可直接在Nginx中写静态映射规则,无需额外模块。

示例配置:

server {
    server_name localhost;

    # 单个文件映射
    location = /catalog/sdasd8ds78asda8/as7da8sd7a8sda/1.png {
        alias /catalog/1/1/1.png;
    }
    
    # 批量匹配同哈希前缀的所有图片
    location ~* ^/catalog/sdasd8ds78asda8/as7da8sd7a8sda/(\d+\.(png|ico|gif|jpg|jpeg))$ {
        alias /catalog/1/1/$1;
    }
}

说明:优点是无需额外模块、配置简单;缺点是数字段数量多的时候,配置会冗长,维护成本高。

内容的提问来源于stack exchange,提问作者King Reload

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:17:33