Nginx做图片服务器时,如何校验权限

需求背景:
将Nginx做图片服务器时,需要对访问权限做校验,避免恶意访问图片.

  1. Nginx配置
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
		charset utf-8;
		
        location / {
            root   html;
            index  index.html index.htm;
        }
		
		location /file/ {  			
			alias "E:\\excel\\";
		}
		
		location ^~ /file_server2/ {		
			# 文件路径
			alias "E:\\excel\\";			
		}
		
		
		location ^~ /file_server/ {
			# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
			internal;
			# 文件路径
			alias "E:\\excel\\";
			limit_rate 200k;
			# 浏览器访问返回200,然后转由后台处理
			error_page 404 =200 @backend;
		}

		
		# 文件下载鉴权
		location @backend {
			# 去掉访问路径中的 /file_server/,然后定义新的请求地址。
			rewrite ^/file_server/(.*)$ /$1 break;
			# 这里的url后面不可以再拼接地址
			proxy_pass http://127.0.0.1:9001;
			proxy_redirect   off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
   
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }        
    }	
}
  1. 服务端
package com.example.springbootdemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;

/**
 * @author JiangHeng
 * @version 1.0.0
 * @ClassName TestController.java
 * @Description TODO
 * @createTime 2021/08/10 17:52
 */
@RestController
public class NginxAuthoController {

    @RequestMapping("/down")
    public String selecVersionInfo(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
        String token = request.getParameter("token");
        System.out.println("由Nginx转发过来的......"+token);
        // 已被授权访问
        // 文件下载
        response.setHeader("Content-Disposition", "attachment; filename=\"" + new String("test.xlsx".getBytes("GBK"), "iso-8859-1") + "\"");
        // 文件以二进制流传输
        response.setHeader("Content-Type", "application/octet-stream;charset=utf-8");
        // 返回真实文件路径交由 Nginx 处理,保证前端无法看到真实的文件路径。
        // 这里的 "/file_server" 为 Nginx 中配置的下载服务名
        response.setHeader("X-Accel-Redirect", "/file_server/20210810/test.xlsx");
        // 限速,单位字节,默认不限
        // response.setHeader("X-Accel-Limit-Rate","1024");
        // 是否使用Nginx缓存,默认yes
        // response.setHeader("X-Accel-Buffering","yes");
        response.setHeader("X-Accel-Charset", "utf-8");

        // 禁止浏览器缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "No-cache");
        response.setHeader("Expires", "0");

        return "success";
    }

    @RequestMapping("/view")
    public String view(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
        String token = request.getParameter("token");
        System.out.println("由Nginx转发过来的......"+token);
        // 已被授权访问
        // 文件直接显示
        response.setHeader("Content-Disposition", "inline; filename=\"" + new String("1.png".getBytes("GBK"), "iso-8859-1") + "\"");
        if ("pdf".equals("1pdf")) {
            // PDF
            response.setHeader("Content-Type", "application/pdf;charset=utf-8");
        } else {
            // 图片
            response.setHeader("Content-Type", "image/*;charset=utf-8");
        }
        // 返回真实文件路径交由 Nginx 处理,保证前端无法看到真实的文件路径。
        // 这里的 "/file_server" 为 Nginx 中配置的下载服务名
        response.setHeader("X-Accel-Redirect", "/file_server/20210810/1.png");
        // 浏览器缓存 1 小时
        response.setDateHeader("Expires", System.currentTimeMillis() + 1000 * 60 * 60);
        return "success";
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker 是一个开源的容器化平台,而 Nginx 是一款高性能的 Web 服务器。你可以使用 Docker 部署和运行 Nginx 作为图片服务器。 以下是一些步骤来实现这个目标: 1. 安装 Docker:首先,确保你的系统上已经安装了 Docker。你可以参考 Docker 官方文档来安装适合你系统的 Docker。 2. 创建一个 Nginx 容器:使用 Docker 命令来创建一个 Nginx 容器。你可以运行以下命令: ``` docker run -d -p 80:80 --name nginx-server -v /path/to/your/images:/usr/share/nginx/html nginx ``` 这个命令会创建一个名为 "nginx-server" 的容器,并将容器的 80 端口映射到主机的 80 端口。同,将本地存放图片的目录 `/path/to/your/images` 挂载到容器内的 `/usr/share/nginx/html` 目录,这样就可以在容器中访问这些图片了。 3. 配置 Nginx:在容器内部,Nginx 默认的静态文件目录是 `/usr/share/nginx/html`。你可以编辑容器内的 Nginx 配置文件来自定义设置。可以通过以下命令进入 Nginx 容器的 Shell: ``` docker exec -it nginx-server bash ``` 然后,可以修改 `/etc/nginx/nginx.conf` 或其他配置文件来满足你的需求。例如,你可以设置缓存、限制访问等。 4. 访问图片:现在,你可以通过访问 `http://localhost`(或主机的 IP 地址)来访问容器中的图片了。Nginx 会根据配置文件的设置来提供这些图片。 这样,你就可以在 Docker 中使用 Nginx 作为图片服务器了。记得将 `/path/to/your/images` 替换为你实际存放图片的路径。希望这些步骤对你有帮助!如有问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值