故事背景

后端使用Docker Compose部署一个代码片段管理应用:snibox,某天因为云服务卡死重启之后再次访问时,登录或退出都返回422状态码。

界面提示如下:



不过奇怪的是;直接通过IP+PORT访问是没问题的,但是使用域名方式访问就会报错。

前端使用nginx作为反向代理,并配置了SSL。

配置信息如下:

server {
listen 80;
server_name snibox.zhangsan.org.cn; rewrite ^(.*)$ https://$host$1 permanent;
} server {
listen 443 ssl;
server_name snibox.zhangsan.org.cn; ssl_certificate /data/ssl/zhangsan.org.cn_cert_chain.pem;
ssl_certificate_key /data/ssl/zhangsan.org.cn_key.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on; client_max_body_size 10M; location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://snibox;
}
}

既然直接使用IP+PORT方式是可以正常访问的,但是使用域名方式确异常,问题应该出在nginx配置上。

解决办法

在nginx配置中设置X-Forwarded-Proto(明确指定客户端与nginx的通信协议为https),即:

proxy_set_header X-Forwarded-Proto https;

最终的nginx完整配置为:

server {
listen 80;
server_name snibox.zhangsan.org.cn; rewrite ^(.*)$ https://$host$1 permanent;
} server {
listen 443 ssl;
server_name snibox.zhangsan.org.cn; ssl_certificate /data/ssl/zhangsan.org.cn_cert_chain.pem;
ssl_certificate_key /data/ssl/zhangsan.org.cn_key.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on; client_max_body_size 10M; location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://snibox;
}
}

关于X-Forwarded-Proto

参考MDN解释

X-Forwarded-Proto (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。

简而言之,X-Forwarded-Proto在nginx中配置时用于明确指定客户端与nginx之间的通信协议。

【参考】

https://feilong.home.blog/2018/12/22/nginx反向代理huginn部分请求422/ Nginx反向代理Huginn部分请求422

https://github.com/snibox/snibox/issues/26 enable cors with specified host

https://techoverflow.net/2022/05/03/how-to-set-x-forwarded-proto-header-in-nginx/ How to set X-Forwarded-Proto header in nginx

一次nginx返回422状态码的经历的更多相关文章

  1. Nginx自定义404页面并返回404状态码

    Nginx定义404页面并返回404状态码, WebServer是nginx,直接告诉我应该他们配置了nginx的404错误页面,虽然请求不存在的资源可以成功返回404页面,但返回状态码确是200. ...

  2. python(30) 获取网页返回的状态码,状态码对应问题查询

    获取访问网页返回的状态码 html = requests.get(Url) respon = html.status_code 以下内容来自于维基百科:点击查看网页 1xx消息 这一类型的状态码,代表 ...

  3. Nginx code 常用状态码学习小结

    最近了解下Nginx的Code状态码,在此简单总结下.一个http请求处理流程: 一个普通的http请求处理流程,如上图所示:A -> client端发起请求给nginxB -> ngin ...

  4. 结合 Nginx 谈谈 Http 状态码

    [Http状态码简介] [百度百科]HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到 RFC ...

  5. IIS7.0设置404错误页,返回500状态码

    一般在II6下,设置自定义404错误页时,只需要在错误页中选择自定义的页面,做自己的404页面即可.但是在IIS7.0及以上时,设置完404错误页后,会发现状态码返回的是500,并且可能会引起页面乱码 ...

  6. ASP.NET设置404页面返回302HTTP状态码的解决方法

    在配置文件中配置404页面如下: .代码如下: <customErrors mode="On" defaultRedirect="404.aspx"> ...

  7. HTTP 返回的状态码 != 200 ,浏览器不会将返回的内容缓存到本地磁盘上

    今天无意发现的,以前处理HTTP State = 404或403之类的,都是直接返回 HTTP 200 OK,然后加一个缓存设置,例如: Cache-Control: max-age=3600 最近修 ...

  8. PHP发送返回404状态码

    1. 默认的由Apache自动处理的404 修改Aache的配置文件 httpd.conf 中的 ErrorDocument 404 /404.html 或者使用 .htaccess文件,同时有要把 ...

  9. HTTP返回结果状态码小结

    HTTP 状态码负责表示客户端 HTTP 请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作. 一.状态码的类别 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果.借助状态 ...

  10. apache 返回的状态码304

    博客转载:http://baike.baidu.com/link?url=jhw62dpK66WD7EQFKWEhVQs_jPeFKIUegnA6 如果客户端发送了一个带条件的GET 请求且该请求已被 ...

随机推荐

  1. [转帖]tidb Modify Configuration Dynamically

    https://docs.pingcap.com/tidb/v6.5/dynamic-config This document describes how to dynamically modify ...

  2. 神通奥斯卡数据库是否兼容Oracle, 以及参数修改的办法

    1. 最近公司要适配神通数据库, 但是因为一些功能异常.参数可能存在风险. 为了减少问题, 想着简单描述一下这些的处理. 开发和客户给的默认参数建议 1. 不选择 兼容oracle模式 2. 字符集选 ...

  3. Booking.com如何在毫秒内搜索数百万个地点

    译自:How Booking.com Searches Through Millions of Locations in Milliseconds Booking.com是一家与酒店.旅馆.度假租赁等 ...

  4. C#开源免费的开发效率提升利器:DevToys开发人员的瑞士军刀!

    前言 今天分享一款基于C#开源(MIT License开源协议).免费.离线.功能齐全的Windows开发者工具箱,号称开发人员的瑞士军刀,可以帮助开发者完成日常工作开发中常用功能:DevToys. ...

  5. STM32CubeMX教程25 PWR 电源管理 - 睡眠、停止和待机模式

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  6. vue3中mixins的使用

    vue3-mixins 在开发的过程中我们会遇见相同或者相似的逻辑代码. 可以通过vue的 mixin 功能抽离公共的业务逻辑, 然后通过impor再组件中引入.通过mixins注册进来. 这样我们就 ...

  7. 使用Visual Studio调试 .NET源代码

    前言 在我们日常开发过程中常常会使用到很多其他封装好的第三方类库(NuGet依赖项)或者是.NET框架中自带的库.如果可以设置断点并在NuGet依赖项或框架本身上使用调试器的所有功能,那么我们的源码调 ...

  8. 介绍一个golang库:zstd

    zstd是facebook开源的一个C语言的压缩库. 从官方提供的压测数据看,它的压缩速度与众所周知的以快著称的snappy的压缩速度几乎持平,但是压缩率上比老牌的gzip还要高. 再看看zstd吊打 ...

  9. Docker部署Jekyll

    1. 起因 前两天终于下单买了个域名,10年的使用期限.既然有了域名,那自己的博客就可以搞起来了. 现在博客的记录用的是Jekyll+Github Pages,所以决定之后自己的博客网站也采用Jeky ...

  10. Protobuf示例:Golang and Python

    之前的文章中已经展示过如何在C++中使用protobuf,本文将简单示范protobuf在Golang和Python中的使用. Talk is cheap. Show you my code. 首先是 ...