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