phpEnv 默认Nginx不支持secure_link指令,因其预编译版本未启用--with-http_secure_link_module;需下载含该模块的Windows版Nginx二进制文件,替换原nginx.exe,并确保OpenSSL兼容性,再配置secure_link相关参数。

phpEnv 是 Windows 下集成 PHP、Nginx、MySQL 的一键环境包(类似 XAMPP),默认 Nginx 不启用 ngx_http_secure_link_module 模块。直接在配置里写 secure_link 会报错:unknown directive "secure_link"。
secure_link 指令在 phpEnv 中根本不可用,除非你手动编译或替换 Nginx
phpEnv 自带的 Nginx 是预编译二进制版,未开启 --with-http_secure_link_module。检查方法:
"C:\phpEnv\nginx\nginx.exe" -V 2>&1 | findstr "secure_link"
如果无输出,说明模块缺失 —— 这是绝大多数 phpEnv 用户遇到问题的根源。
- 不是配置写错了,是 Nginx 二进制根本不认识这个指令
- 修改
nginx.conf加secure_link会导致nginx -t失败,服务无法启动
如何让 phpEnv 支持 secure_link
必须替换 Nginx 可执行文件和相关模块:
立即学习“PHP免费学习笔记(深入)”;
- 下载已编译好含
secure_link模块的 Windows 版 Nginx(例如 nginx-win 或 nginx-binary + 自行编译) - 确保下载版本输出中包含:
configure arguments: ... --with-http_secure_link_module - 停止 phpEnv 的 Nginx 服务
- 备份原
C:\phpEnv\nginx\nginx.exe,再替换为新二进制 -
不要覆盖整个 nginx 目录,只换
nginx.exe和必要.obj/.lib(若提示 DLL 缺失,需一并补全)
⚠️ 注意:phpEnv 的 Nginx 通常依赖 OpenSSL 1.1.1x,新版 Nginx 若用 OpenSSL 3.x 可能握手失败或 HTTPS 异常,建议优先选 OpenSSL 1.1 兼容版本。
替换后,最小可用 secure_link 配置示例(放在 server 块内)
location ^~ /dl/ {
secure_link $arg_st,$arg_e;
secure_link_md5 "mykey$uri$arg_e";
if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }
alias C:/phpEnv/www/private/;
internal;
}-
$arg_st和$arg_e对应 URL 中的?st=xxx&e=1718892000 -
mykey必须与后端生成签名时用的密钥完全一致(包括空格、大小写) -
internal;是硬性要求:防止用户绕过签名,直接访问/dl/xxx.zip
PHP 生成签名时最容易踩的坑
-
md5($uri . $secret . $expires)❌ 错误顺序(Nginx 内部是按secure_link_md5表达式拼接的) - 忘记
urlencode()文件名里的中文/空格,导致 Nginx 的$uri和 PHP 拼接的路径不一致 - 使用
time() + 300生成$expires,但服务器时间比 Nginx 主机快/慢 >60 秒 → 频繁 410 - 把
st=参数 base64 编码后没做urlsafe<em>b64encode</em>(即把+和/换成-和),Nginx 解析失败
实际推荐 PHP 签名片段:
$uri = '/dl/report.pdf';
$secret = 'mykey';
$expires = time() + 300;
$raw = $uri . $secret . $expires;
$hash = md5($raw, true);
$st = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($hash));
$url = "http://localhost/dl/report.pdf?st={$st}&e={$expires}";secure_link 在 phpEnv 中不是“配一下就能用”的功能,而是需要先解决模块缺失这个底层前提。很多人卡在第一步就放弃,其实只要换对 Nginx 二进制,后续配置和线上环境完全一致。最麻烦的永远是密钥同步和时间校准,而不是语法。



















