nginx鉴权访问
当网站有特定的内容不允许随意访问时,比如证件图片、证书文件、logs等,但有时需要情况下可访问,比如管理员查看证件图片,那么就可以利用nginx鉴权功能
要先确定nginx在安装时编译了--with-http_secure_link_module模块,执行名称可查看是否已编译了该模块,如果没有,那么则需要重新编译安装

nginx -V 2>&1 | grep -- --with-http_secure_link_module
nginx该功能的官方文档链接:https://nginx.org/en/docs/http/ngx_http_secure_link_module.html
nginx配置

location ~ ^/(certificate|logs)/ { #例如url路径开头是certificate或logs则需要鉴权
secure_link $arg_sign,$arg_expires;
secure_link_md5 "$secure_link_expires$uri 123456"; #123456位置为自定义鉴权密码
if ($secure_link = "") {
return 403;
}if ($secure_link = "0") {
return 403;
}
}
php生成鉴权参数

function buildSecretUrl($url, $time = 300){ //300为鉴权参数有效期,单位:秒
$parse = parse_url($url);
$time = time() + $time;
$res = base64_encode(md5($time . $parse['path'] . ' ' . '123456', true)); //123456处为鉴权密码,要和nginx配置中的密码一致
$res = str_replace(['+', '/'], ['-', '_'], $res);
$res = rtrim($res, '=');
return $url.(empty($parse['query']) ? '?' : '&')."sign={$res}&expires={$time}";
}
//示例
echo buildSecretUrl('https://www.demo.com/logs/2024.txt');//返回内容https://www.demo.com/logs/2024.txt?sign=lPwlaxQBmvOTdpcKVmFerg&expires=1728105304
以上示例的链接,如果无法未添加鉴权参数或参数过期,打开链接页面会显示403
登录后可发表评论
点击登录