Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)

文章介绍了如何在Windows上利用nginx和openresty集成lua脚本来实现静态资源(特别是图片)的权限控制。通过设置不同的文件目录,结合lua脚本和redis进行token验证,实现了用户登录后才能访问隐私图片的功能,而公开图片则可以直接访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

1
同nginx配置server以后,我们可以很方便的直接访问到文件服务器上的文件资源,但是某些情况下,文件资源可能是隐私图片,比如客户注册时上传的身份证照片等等,这时候我们需要对图片访问进行控制,必须登录后才能查看到这些隐私图片。
2
一般来说,我们都是通过后端controller对权限进行控制,但是nginx作为图片服务器的情况下,再专门为此写一个后端程序显然比较笨重。所以根据实际情况,我们采用openresty平台,用lua脚本+redis读取token的方式即可完成对图片访问服务器的权限控制。

步骤

1.服务器文件目录设置

正常来说我们的文件存放目录是统一的,但是由于有些文件是开放访问的,比如网页图片,有的文件是隐私的,比如注册信息。所以此时我们将文件服务器目录修改为两个文件夹,public和private,public用以存放开发文件,private存放登陆后才可以访问的文件。

2.openresty下载

进入官网下载页:http://openresty.org/en/download.html

选择windows版本的压缩包进行下载
在这里插入图片描述
将压缩包解压到本地目录,openresty是nginx和lua的结合,此时我们编写lua脚本并修改nginx.conf,测试openresty。
在openresty目录下的lua文件夹下新建txt文件,

ngx.say('hello lua!!!')

然后重命名txt为hello.lua
如图所示
在这里插入图片描述
在这里插入图片描述
然后在penresty目录下的conf文件夹下,修改nginx.conf

	 server {
        listen       9000;
        server_name  localhost;
		
		location  / {

			default_type 'text/html';
			rewrite_by_lua_file  lua/hello.lua;
		}
		
	}

在这里插入图片描述
修改完成后,启动openresty下的nginx.exe
然后通过cmd运行

./nginx -s reload

启动nginx
在这里插入图片描述
然后浏览器键入 http://127.0.0.1:9000/ 如图所示即为成功
在这里插入图片描述

3 配置nignx权限控制

	#反向代理进入文件查询服务器
	upstream download{
		server  127.0.0.1:8282;
	}

    server {
        listen       8282;
        server_name  localhost;
		
		location /file_resources/private/ {
            alias  D:/society/file_resources/private/;
        }
		}
    server {
        listen       8082;
        server_name  localhost;
        
		client_max_body_size 10000m;
		
		
        location  / {
            index      index.html;
        }
        #开放文件,直接进入文件目录查找
		location /file_resources/public/ {
            alias  D:/society/file_resources/public/;
        }
		
		
		#隐私文件,匹配下载请求前缀,进入token.lua, 进行token鉴权,
		location  /file_resources/private/ {

			default_type 'text/html';
			rewrite_by_lua_file  lua/token.lua;
			proxy_pass  http://download;
		}

	}

4. token.lua编写

该处获取请求的token为get请求参数获取
如为cookie中, ngx.var.arg_token改为 ngx.var.cookie_token即可

-- 从cookie中获取token值key为token)
local token = ngx.var.arg_token
--判断token是否为空,为空返回登录
if not token then
    ngx.redirect("http://127.0.0.1:8086/login", 302)
--判断token存在,则根据redis存储格式拼写Token, “..”为字符串拼接
else
   token = "prefix_user_token_" .. ngx.var.arg_token
end

local function close_redis(red)
    if not red then
        return
    end
    local pool_max_idle_time = 30000 --毫秒  
    local pool_size = 50 --连接池大小  
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) 
    if not ok then
        ngx.say("close redis error : ",err);
    end
end

-- 连接redis
local redis = require "resty.redis";
local red = redis:new();
red:set_timeout(2000)

local ok,err = red:connect("192.168.0.28", 6379)
if not ok then
  ngx.say("failed to connect: ", err)
end

-- 根据自身redis是否有密码开启本部分
--local res, err = red:auth("password")
--if not res then
--  ngx.say("failed to authenticate: ", err)
--end

-- redis中若 key 存在返回 1 ,否则返回 0 。
local resp, err = red:exists(token) 
if not resp then  
    ngx.say("get msg error : ", err)  
    return close_redis(red)  
end  
if resp == ngx.null then  
    resp = ''  
end  
if resp == 0 then
--   ngx.exit(ngx.HTTP_FORBIDDEN) 
    ngx.redirect("http://127.0.0.1:8086/login", 302)
end
close_redis(red)

完成后 执行 nginx -s reload重启nginx即可

5.结果展示

开开放图片在这里插入图片描述

隐私图片访问失败

如图通过开发工具可以看到访问的是图片地址,由于token为空,所以直接转转到了login页面
在这里插入图片描述

隐私图片访问成功

带上token,访问成功
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值