使用阿里云对象存储的时候,私有的文件,生成一个授权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
声明:本站所有文章和图片,如无特殊说明,均为原创发布,转载请注明出处。