Nginx请求参数解析

在这里插入图片描述
例: $arg_token 取的就是 uri?args 中 token=xxx 的部分

$arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。$args #这个变量等于请求行中(GET请求)的参数,例如foo=123&bar=blahblah;$binary_remote_addr #二进制的客户地址。$body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。$content_length #请求头中的Content-length字段。$content_type #请求头中的Content-Type字段。$cookie_COOKIE #cookie COOKIE变量的值$document_root #当前请求在root指令中指定的值。$document_uri #与$uri相同。$host #请求主机头字段,否则为服务器名称。$hostname #Set to the machine’s hostname as returned by gethostname$http_HEADER$is_args #如果有$args参数,这个变量等于”?”,否则等于”",空值。$http_user_agent #客户端agent信息$http_cookie #客户端cookie信息$limit_rate #这个变量可以限制连接速率。$query_string #与$args相同。$request_body_file #客户端请求主体信息的临时文件名。$request_method #客户端请求的动作,通常为GET或POST。$remote_addr #客户端的IP地址。$remote_port #客户端的端口。$remote_user #已经经过Auth Basic Module验证的用户名。$request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。$request_method #GET或POST$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。$request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。$scheme #HTTP方法(如http,https)。$server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。$server_addr #服务器地址,在完成一次系统调用后可以确定这个值。$server_name #服务器名称:域名或IP 那部分。     // 例: set $auth_request_uri "http://$server_name:8090/system/user/auth?$args";$server_port #请求到达服务器的端口号。$uri #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。该值有可能和$request_uri 不一致。$request_uri是浏览器发过来的值。该值是rewrite后的值。例如做了internal redirects后。

使用auth_request做权限控制

背景:生产环境对于图片使用 标签来显示图片,或使用 element-ui 的 标签进行图片预览;

但是直接访问 url: http://192.168.0.225:8002/file/20231011/%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86%E5%B7%A5%E4%BD%9C%E7%AB%99_531011143641805.pdf
浏览器会下载文件
或 直接 <img src = http://192.168.0.225:8002/file/20231011/wu2_531011104758539.png"。

所有人在外网都可以访问,不安全。不会经过java 后端接口的 @SaCheckLogin 鉴权。
所以,要么不直接访问 ,而是通过后端接口返回。 要么在nginx 层加一个权限校验, lua 鉴权或 通过 nginx 自带的模块 --with-http_auth_request_module

为了省事,采用了 nginx的 模块方式:
所以,前端开发人员就需要在图片加载过程中携带验证的信息。如 token,用于身份验证、权限控制等方面。通过在图片的 URL 后面(get请求方式),或请求头中携带 token 信息,从而实现图片信息的安全传输。
同时 后端增加一个单纯的鉴权接口:
/system/user/auth

    @SaCheckLogin@GetMapping("/auth")public String info() throws Exception {try {return LoginHelper.getUsername();}catch (Exception e){throw new Exception("用户未登录!"+e.getMessage());}}

浏览器访问图片链接,然后根据request中的token信息判断此用户是否登录态 若是则返回 response.setStatus(200)
若不是登录态,则400.

技术:采用Nginx自带的auth_request模块(网上也有一些其他的方法比如安装redis模块,在nginx里直接查询redis,这里我们不做介绍)。

开启auth_request

需要重新编译nginx源码,把auth_request加入到nginx中,(1.5.4以上,默认包含auth_request,需要编译的时候开启)

配置校验参数

log_format  pro '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_referer" "$http_user_agent" $request_time req_body:"$request_body"''"$http_user_agent" "$http_x_forwarded_for"';
server {listen 8002;server_name 192.168.0.225 localhost api.ltkj.com;# root /data/wwwroot/static.ltkj.com/project;# 重定向到error401 时用proxy_intercept_errors on;#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md){return 404;}// 处理文件location ^~ /file/ {# expires      30d;set $auth_request_uri "http://$server_name:8090/system/user/auth?$args";auth_request /auth;auth_request_set $user $upstream_http_x_forwarded_user;proxy_set_header X-Forwarded-User $user;error_page 401 500 = /error401;root /data/wwwroot/static.ltkj.com/project;}
// 处理图片location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {# img 标签 header中设置 token方式 未成功,待测试add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';auth_request /auth;error_page 401 500 = /error401;auth_request_set $user $upstream_http_x_forwarded_user;proxy_set_header X-Forwarded-User $user;set $auth_request_uri "http://$server_name:8090/system/user/auth?$args";root /data/wwwroot/static.ltkj.com/project;}location /auth {# 表示该路径仅仅为nginx内部访问,一旦出了这个配置文件,则失效internal;# 自己系统的认证路径# proxy_pass http://localhost:8090/system/user/auth;proxy_pass $auth_request_uri ;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Original-URI $request_uri;proxy_set_header X-Original-METHOD $request_method;error_page 401 500  = /error401;}# 认证失败后的处理location = /error401 {# 强制浏览器不使用缓存,防止缓存带来的还能访问系统# 如果认证失败,跳转到自己系统的登录页面return 302 http://192.168.0.225:8001/index;}access_log  /data/logs/nginx/project_manager/access.log pro;error_log  /data/logs/nginx/project_manager/error.log ;
}

灵魂代码!灵魂代码!灵魂代码!

set $auth_request_uri "http://192.168.0.225:8090/system/user/auth?$args";

我的项目需求是对图片做权限校验,图片展示是直接在img标签里面展示的,因此,没法做请求头的设置,需要在链接后面携带校验信息。如:http://127.0.0.1/api/image/123.jpg?token=xxx

这时候校验信息,而网上大部分是没有这段代码的set $auth_request_uri "http://192.168.40.14:8080/image/auth?$query_string"; 导致参数无法传递到r后端校验地址(如果是设置请求头里的,可以获取到)。

校验成功就将127.0.0.1/api/image/123.jpg?token=xxx转发到 minio地址:9000/123.jpg。

校验失败后台设置响应状态401或403,将转发到authError.png这张图片上。

测试url

  • http://192.168.0.225:8002/pic/20230825/530825093805902100.jpg 跳转到登录页 or 首页
  • http://192.168.0.225:8002/pic/20230825/530825093805902100.jpg?Authorization=Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJ0dEtOdkE5VTNwQkllWmgxV1h5OUZETWVoUzZINk5MbCIsInVzZXJJZCI6MX0.6_FQyAqTrRsWR4HdhD2qmFeqAOrHJ6cVguCzaW2JlC0 成功预览
  • http://192.168.0.225:8002/file/20231011/系统管理工作站_531011143641805.pdf
  • http://192.168.0.225:8002/file/20231011/系统管理工作站_531011143641805.pdf?Authorization=Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJ0dEtOdkE5VTNwQkllWmgxV1h5OUZETWVoUzZINk5MbCIsInVzZXJJZCI6MX0.6_FQyAqTrRsWR4HdhD2qmFeqAOrHJ6cVguCzaW2JlC0

————————————————

上面是把token加在url 后面 ?token=“xxx” ,这种方式 get方式。

下面 尝试入到 header中

探索前端图片如何携带token进行验证
vue中给img的src添加token

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈安科瑞无线测温设备在俄罗斯某项目的应用

摘要&#xff1a;安科瑞ATE系列和ARTM-Pn无线测温设备适用于高低压柜的梅花触头&#xff0c;线缆&#xff0c;母排等位置对温度的实时监测。 Abstract: ATE series and ARTM-Pn are suitable for monitoring the real-time temperature of circuit breaker contact,cable,busb…

跨境电商:为民营经济注入新活力

中国的民营经济一直以来都是国家经济发展的中流砥柱&#xff0c;而近年来&#xff0c;跨境电商产业崭露头角&#xff0c;为民营经济注入了新的活力和机遇。本文将探讨跨境电商如何成为中国民营企业的助推引擎&#xff0c;以及其对民营经济的积极影响。 民营经济的支柱地位 中国…

ChatGPT AIGC 完成Excel跨多表查找操作vlookup+indirect

VLOOKUP和INDIRECT的组合在Excel中用于跨表查询,其中VLOOKUP函数用于在另一张表中查找数据,INDIRECT函数则用于根据文本字符串引用不同的工作表。具体操作如下: 1.假设在工作表1中,A列有你要查找的值,B列是你希望查询的工作表名称。 2.在工作表1的C列输入以下公式:=VLO…

iMeta框架使用方法

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

判断非线性负载是否合格的方法可以从以下几个方面进行考虑:

额定功率容量&#xff1a;需要了解负载设备的额定功率容量&#xff0c;根据负载设备的规格和说明书&#xff0c;确定其额定功率容量是否能够满足实际需求&#xff0c;如果超过了负载设备的额定功率容量&#xff0c;可能会导致设备过载&#xff0c;从而影响其正常运行。 电压波形…

JVM 垃圾回收机制(可达性分析、引用计数)

目录 1 什么是垃圾2 为什么需要回收3 哪些对象被判定为垃圾呢3.1 引用计数法3.2 可达性分析算法&#xff1a;GC Roots根 1 什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象&#xff0c;就是需要被回收的。 2 为什么需要回收 执行程序会不断地分配内存空间&#xff0c…

分布式事务协调中间件---seata快速入门

分布式事务 Seata&#xff0c;之前叫做Fescar&#xff0c;是一个开源的分布式事务解决方案&#xff0c;它主要致力于提供高效和简单的分布式事务服务。Seata主要用于解决微服务架构下的数据一致性问题。 Seata 的基本原理是基于两阶段提交 (2PC) 以及三阶段提交 (3PC)&#xff…

nodejs+vue水浒鉴赏平台系统

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

C++ 反向迭代器

反向迭代器的即正向迭代器的--&#xff0c;反向迭代器的--即正向迭代器的&#xff0c;反向迭代器和正向迭代器的很多功能都是相似的&#xff0c;因此我们可以复用正向迭代器作为反向迭代器的底层容器来封装&#xff0c;从而实现出反向迭代器&#xff0c;即&#xff1a;反向迭代…

【LeetCode 算法专题突破】双指针(⭐)

文章目录 前言1. 移动零题目描述代码 2. 复写零题目描述代码 3. 快乐数题目描述代码 4. 盛最多水的容器题目描述代码 5. 有效三角形的个数题目描述代码 6. 三数之和题目描述代码 7. 四数之和题目描述代码 总结 前言 学算法入门必学的一个章节&#xff0c;双指针算法&#xff0…

计算机网络-计算机网络体系结构-数据链路层

目录 *一、组帧 1.1字符计数法 1.2字符填充法 1.3零比特填充法 1.4违规编码 *二、差错控制 2.1检错编码 2.2.1奇偶校验码 2.2.2 CRC循环冗余码 2.2纠错编码-海明码 *三、流量控制和可靠传输机制 流量控制 停止-等待协议 ​编辑 后退n帧协议的滑动窗口(GBN) 选择…

ChatGPT AIGC 制作大屏可视化分析案例

第一部分提示词prompt: 商品 价格 p1 13 p2 41 p3 42 p4 53 p5 19 p6 28 p7 92 p8 62 城市 销量 北京 69 上海 13 南京 18 武汉 66 成都 70 你现在是一名非常专业的数据分析师,请结合上述数据完成下列几件事情 1:第一部分数…

基于 Triple 实现 Web 移动端后端全面打通

*作者&#xff1a;陈有为&#xff0c;陌陌研发工程师、Apache Dubbo PMC RPC 协议开发微服务 在我们正常开发微服务的时候&#xff0c;传统 RPC 服务可能在最底层。上层可能是浏览器、移动端、外界的服务器、自己的测试、curl 等等。我们可能会通过 Tomcat 这种外部服务器去组…

机器视觉知识讲的深不如讲的透

我深思这个话题&#xff0c;大家来培训&#xff0c;其实培训机构也很痛苦&#xff0c;每个热掌握的参差不齐&#xff0c;你说他不会吧&#xff0c;会一点电气&#xff0c;你说他会吧&#xff0c;会一点Opencv&#xff0c;会一点visionpro,会一点Visionmaster,会一点Halcon。好像…

【Retinex theory】【图像增强】-笔记

1 前言 retinex 是常见的图像增强的方法&#xff0c;retinex 是由两个单词合成的&#xff1a;retina conrtex &#xff0c;即视网膜皮层。 2 建立的基础 Land 的 retinex theory 建立在三个假设之下&#xff1a; 真实世界是无色的&#xff0c;我们所谓的颜色是光和物质相互…

上位机在自动化中有何作用和优势?

今日话题 上位机在自动化中有何作用和优势&#xff1f; 自动化控制编程领域包括单片机、PLC、机器视觉和运动控制等方向。输入“777”&#xff0c;即刻获取关于上位机开发和数据可视化的专业学习资料&#xff0c;近年来&#xff0c;上位机编程逐渐兴起&#xff0c;正在逐步替…

【Linux】环境下部署Nginx服务 - 二进制部署方式

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Linux网络编程系列之服务器编程——非阻塞IO模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

将license验证加入到系统中

1.将ClientDemo下的cn文件夹的内容导入项目对应的java目录下。 2.将license-config.properties文件导入resources目录下。 3.在项目的pom.xml中添加如下依赖。 <properties><!-- Apache HttpClient --><httpclient>4.5.5</httpclient><!-- License…

MySQL 4 MySQL使用演示(包含基本操作命令~~~)MySQL5.7编码设置

目录 1 MySQL的使用演示&#xff08;8.0和5.7版本对比&#xff09; 1、查看所有的数据库 2、创建自己的数据库 3、使用自己的数据库 4、查看某个库的所有表格 5、创建新的表格 6、查看一个表的数据 7、添加一条记录 8、查看表的创建信息 9、查看数据库的创建信息 …