nginx配置指定目录访问需要鉴权

网站有特定的内容不允许随意访问时,比如证件图片、证书文件、logs等,但有时需要情况下可访问,比如管理员查看证件图片,那么就可以利用nginx鉴权功能


要先确定nginx在安装时编译了--with-http_secure_link_module模块,执行名称可查看是否已编译了该模块,如果没有,那么则需要重新编译安装

nginx -V 2>&1 | grep -- --with-http_secure_link_module

nginx配置指定目录访问需要鉴权,第1张

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