Nginx 使用 Njs 授权访问文件

本文被收录到:

使用阿里云对象存储的时候,私有的文件,生成一个授权key,就可以访问私有的文件。使用 Nginx 也可以开发出这种功能。

比如,一个静态资源地址是 https://test.com/uploads/test.mp3,现在使用 Njs 可以做到无法使用这个链接直接访问,需要添加后面的加密字符串才能访问。

https://test.com/uploads/test.mp3?key=3F3MVJbx-YCb5NTIpf2x77xtNmQxc-5yx_qM


nginx.conf 配置文件添加:

http {
	...
  ### Njs 配置
  js_path '/usr/local/nginx/conf/njs/';
  js_import test from test.js;
  ...
}


虚拟主机文件:

server {
  listen 80;
  server_name test.com;
  charset utf-8;

  location / {
    js_content test.my_headers_filter;
  }

  location @app-backend {
    root /data/www/_test;
    index index.php index.html index.htm;
  }
}


Njs 文件 test.js:

function getQueryStringArgs(qs){
  var args = {} //保存数据的对象
  var items = qs.length ? qs.split("&") : [] //拆分每个字符串参数
  var item = null,
    name = null,
    value = null
 
  var len = items.length
 
  for(var i=0;i<len;i++){
    //遍历,逐个将每一项添加到args对象中
    item = items[i].split("=")
    name = decodeURIComponent(item[0])
    value = decodeURIComponent(item[1])
 
    if(name.length){
      args[name] = value
    }
  }
  return args
}

function my_headers_filter(r) {
  r.headersOut['Content-Type'] = "application/json; charset=utf-8";
  var get = getQueryStringArgs(r.variables.args);

  if (r.method == 'GET' && get['key']=='123') {
    r.internalRedirect('@app-backend');
    return;
  } else {
    r.return( 400 , JSON.stringify(get) ); 
    return;
  }
}

export default {my_headers_filter};


参考文档:https://nginx.org/en/docs/njs/index.html

修改时间 2023-11-02

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
真诚赞赏,手留余香
赞赏
搜神记
766 文章
4 教程
8 项目
随机推荐
WordPress 添加自定义接口
Node.js path 模块
使用 MySQL 线程池对压力测试的影响
SQL 注入的生命力
WordPress 数据库操作
WordPress用户的user_login, user_nicename, display_name 和 nickname有什么区别
macOS 使用 crontab 定时任务
JavaScript 事件流