当前位置: 首页 > news >正文

Openresty 中 ngx.exit(403)的时候,给403页面的body中传递一个参数展示出来

Openresty 中 ngx.exit(403)的时候,我想给403页面的body中传递一个参数展示出来

在 OpenResty 中,ngx.exit(403) 会立即终止请求并返回 HTTP 403 状态码,默认情况下不会带有自定义的响应体。要在返回 403 状态码时自定义响应体并传递参数,你可以采用以下方式:

方法:使用 ngx.say 输出自定义的响应体

你可以在调用 ngx.exit(403) 之前使用 ngx.say 来输出自定义的响应体内容。这样可以确保在返回 403 状态码时,响应体包含你想要展示的内容。

local message = "Access Denied. Please contact support with error code: 12345"-- 输出自定义的响应体内容
ngx.status = ngx.HTTP_FORBIDDEN
ngx.say(message)-- 确保响应立即生效并停止处理
return ngx.exit(ngx.HTTP_FORBIDDEN)

说明:

  1. ngx.status:设置 HTTP 响应状态码为 403(ngx.HTTP_FORBIDDEN)。
  2. ngx.say:输出响应体内容。在这种情况下,你可以输出任何字符串、HTML、JSON 等内容。
  3. ngx.exit:确保立即结束请求处理并发送响应。

示例:返回自定义的 HTML 页面

如果你想返回一个自定义的 HTML 页面并在页面中展示特定的参数,可以如下处理:

local error_code = "ERR12345"local html_content = [[
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<p>Access Denied. Please contact support with error code: ]] .. error_code .. [[</p>
</body>
</html>
]]ngx.status = ngx.HTTP_FORBIDDEN
ngx.header["Content-Type"] = "text/html"
ngx.say(html_content)return ngx.exit(ngx.HTTP_FORBIDDEN)

说明:

  • ngx.header["Content-Type"]:设置响应的内容类型为 text/html
  • html_content:自定义的 HTML 内容,其中包括了你想传递的参数 error_code

总结

在 OpenResty 中,通过 ngx.say 输出内容并结合 ngx.exit(403),你可以实现返回 403 状态码时自定义响应体,并传递参数到前端展示。

将自定义的 HTML 页面内容抽离到外部文件或模板中管理

在 OpenResty 中,你可以将自定义的 HTML 页面内容抽离到外部文件中进行管理,然后在 Lua 脚本中读取并返回这些内容。这使得你的代码更加整洁和易于维护。

方法:从外部文件读取 HTML 模板

你可以将自定义的 HTML 内容存储在一个文件中,然后使用 Lua 的文件 I/O 功能读取该文件的内容,并将其作为响应体返回。

1. 创建 HTML 模板文件

假设你将自定义的 403 页面存储在 /usr/local/openresty/nginx/html/403.html 文件中:

<!-- /usr/local/openresty/nginx/html/403.html -->
<html>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
<p>Access Denied. Please contact support with error code: {{error_code}}</p>
</body>
</html>

2. 在 Lua 脚本中读取并处理 HTML 模板

使用 Lua 代码读取 HTML 文件的内容,然后替换模板中的占位符,最后输出给客户端。

local function read_file(path)local file = io.open(path, "r")  -- 以只读模式打开文件if not file thenreturn nilendlocal content = file:read("*a")  -- 读取文件内容file:close()return content
endlocal error_code = "ERR12345"
local template_path = "/usr/local/openresty/nginx/html/403.html"
local html_content = read_file(template_path)if html_content then-- 替换占位符html_content = string.gsub(html_content, "{{error_code}}", error_code)-- 设置响应头和响应体ngx.status = ngx.HTTP_FORBIDDENngx.header["Content-Type"] = "text/html"ngx.say(html_content)
else-- 如果文件读取失败,返回一个简单的403消息ngx.status = ngx.HTTP_FORBIDDENngx.say("403 Forbidden - Template file not found")
endreturn ngx.exit(ngx.HTTP_FORBIDDEN)

3. 将代码添加到 OpenResty 配置中

确保将上述 Lua 代码添加到 OpenResty 的处理阶段,比如 content_by_lua_block 中。

server {listen 80;server_name example.com;location / {content_by_lua_block {-- 这里是你上面的 Lua 代码}}location /403 {content_by_lua_block {-- 也可以为特定路径返回403页面-- 这里是你上面的 Lua 代码}}
}

说明

  • read_file 函数:读取指定路径的文件内容。
  • string.gsub:将模板中的占位符 {{error_code}} 替换为实际的错误代码。
  • ngx.header["Content-Type"]:设置响应的内容类型为 text/html

优化建议

  1. 模板引擎:如果你的模板较复杂,可以使用 Lua 的模板引擎(例如 lua-resty-template)来处理模板文件和变量替换。
  2. 文件缓存:为了提高性能,可以将模板文件缓存起来,避免每次请求都重新读取文件。

a. 引入 Lua 模板引擎,如 lua-resty-template,优化模板处理。

b. 为其他错误状态码(如 404、500)创建类似的模板管理机制。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 怎样快速搭建 Linux 虚拟机呢?(vagrant 篇)
  • unity3d拼图__附带资源
  • 上书房信息咨询:消费者需求研究指标设计
  • 医院挂号系统的伪代码
  • 看图学sql之sql 中的UNION 和union all
  • html 基础标签
  • 深入解析Smarty SSTI 利用
  • 艾体宝干货丨OIDA之一:掌握数据包分析-学会观察
  • 橙子投屏,轻松连接大屏幕
  • 数学建模2024国赛时间及事项安排
  • 基础概念与简单数据结构的笔记02
  • Linux shell编程学习笔记74:sed命令——沧海横流任我行(中)
  • 滚珠丝杆与支撑座的标准安装与调试方法!
  • 命令执行漏洞-rce
  • C++学习笔记——三角形面积
  • hexo+github搭建个人博客
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android优雅地处理按钮重复点击
  • express + mock 让前后台并行开发
  • input的行数自动增减
  • Javascripit类型转换比较那点事儿,双等号(==)
  • mongodb--安装和初步使用教程
  • Python中eval与exec的使用及区别
  • Terraform入门 - 1. 安装Terraform
  • 程序员该如何有效的找工作?
  • 从0到1:PostCSS 插件开发最佳实践
  • 大快搜索数据爬虫技术实例安装教学篇
  • 马上搞懂 GeoJSON
  • 盘点那些不知名却常用的 Git 操作
  • 前端之Sass/Scss实战笔记
  • 手写双向链表LinkedList的几个常用功能
  • ionic异常记录
  • RDS-Mysql 物理备份恢复到本地数据库上
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​数据结构之初始二叉树(3)
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #if等命令的学习
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (k8s)Kubernetes本地存储接入
  • (ros//EnvironmentVariables)ros环境变量
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (纯JS)图片裁剪
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (九十四)函数和二维数组
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)ABI是什么
  • (转)socket Aio demo
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net core + vue 搭建前后端分离的框架
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core中Emit的使用