解决 Nginx 自定义 400 错误页面资源加载问题(SSL)

解决 nginx 自定义 400 错误页面资源加载问题(ssl)

本文旨在解决在使用 Nginx 配置自定义 400 错误页面时,通过 HTTP 访问 HTTPS 端口导致资源无法加载的问题。我们将分析问题原因,并提供配置 Nginx 以正确处理 HTTP 和 HTTPS 请求的方案,确保自定义错误页面能够正常显示,提升用户体验。通过配置默认服务器和调整 Nginx 配置,可以有效解决资源加载问题。

当使用 Nginx 配置自定义错误页面,特别是针对 SSL (HTTPS) 的站点时,可能会遇到一个常见问题:当用户尝试通过 HTTP 访问 HTTPS 端口时,虽然会显示自定义的 400 错误页面,但页面中的资源(如图片、CSS 样式等)无法正确加载。这通常是由于浏览器尝试通过错误的协议(HTTP)去请求资源,导致请求失败。

问题分析

Nginx 基于端口、协议(HTTP 或 HTTPS)和 server_name 来匹配请求。如果请求的协议与配置的 server block 不匹配,Nginx 可能无法找到合适的服务器块来处理请求,从而返回 400 错误。

具体到这个问题,当用户在浏览器中输入 http://192.168.1.1:789 时,浏览器发起的是 HTTP 请求,但 Nginx 配置中监听 789 端口的 server block 配置了 SSL,期望的是 HTTPS 请求。因此,Nginx 找不到匹配的 server block 来处理 HTTP 请求,虽然会显示自定义的 400 错误页面,但由于资源路径是基于 HTTP 的,导致资源加载失败。

解决方案:配置默认服务器

最推荐的解决方案是配置一个 default_server 来处理所有未匹配的 HTTP 请求。这可以确保所有进入服务器的请求都能被正确处理,即使它们不符合任何特定的 server block。

创建 HTTP 监听的 server block:

首先,需要创建一个监听 HTTP 端口(通常是 80)的 server block。这个 server block 将作为默认服务器,处理所有通过 HTTP 发起的请求。

server {    listen 80 default_server;    listen [::]:80 default_server; # IPv6    server_name _; # 匹配所有域名    # 返回 400 错误页面    error_page 400 /400_page.html;    location = /400_page.html {        root /etc/nginx/error_pages;        internal;    }    # 其他错误页面配置(可选)    error_page 404 /404_page.html;    location = /404_page.html {        root /etc/nginx/error_pages;        internal;    }    # 重定向到 HTTPS (可选)    return 301 https://$host$request_uri;}

在这个配置中,listen 80 default_server; 指明这个 server block 是默认服务器,用于处理所有通过 80 端口发起的 HTTP 请求。server_name _; 表示匹配所有域名。return 301 https://$host$request_uri; (可选) 可以将所有 HTTP 请求重定向到 HTTPS。

修改 HTTPS 监听的 server block:

确保 HTTPS 监听的 server block 配置正确,并且包含必要的 SSL 证书信息。

upstream dashboardapp{    server test_server:80;}server {    listen 789 ssl;    server_name  example.com;    ssl_certificate /etc/nginx/certs/host.crt;    ssl_certificate_key /etc/nginx/certs/host.key;    location / {        proxy_read_timeout 1800;        proxy_connect_timeout 1800;        proxy_send_timeout 1800;        send_timeout 1800;        proxy_hide_header x_destination;        proxy_pass http://dashboardapp;    }    location /error_pages {        root /etc/nginx/;    }    error_page 495 496 497 /400_page.html;    location = /400_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 404 /404_page.html;    location = /404_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 500 /500_page.html;    location = /500_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 502 /502_page.html;    location = /502_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 503 /503_page.html;    location = /503_page.html {        root /etc/nginx/error_pages;        internal;    }}

资源路径问题:

确保自定义错误页面中的资源路径使用绝对路径或相对于网站根目录的路径。避免使用相对路径,因为浏览器可能会基于错误的 URL 来解析相对路径,导致资源加载失败。

例如,将 src=”../error_pages/assets/images/img12.png” 修改为 src=”/error_pages/assets/images/img12.png”,或者使用完整的 URL src=”https://example.com/error_pages/assets/images/img12.png”。

重启 Nginx:

修改 Nginx 配置文件后,需要重启 Nginx 服务才能使配置生效。

sudo nginx -t  # 检查配置是否正确sudo systemctl restart nginx

替代方案:同一端口处理 HTTP 和 HTTPS(不推荐)

虽然不推荐,但技术上可以在同一端口上处理 HTTP 和 HTTPS 请求。这需要使用 Nginx 的 if 指令来判断请求的协议,并根据协议来处理请求。然而,这种方法可能会导致配置复杂,并且性能较低。

server {    listen 789;    server_name example.com;    if ($scheme = http) {        # 处理 HTTP 请求        return 301 https://$host$request_uri; # 重定向到 HTTPS    }    # 处理 HTTPS 请求    ssl_certificate /etc/nginx/certs/host.crt;    ssl_certificate_key /etc/nginx/certs/host.key;    location / {        proxy_read_timeout 1800;        proxy_connect_timeout 1800;        proxy_send_timeout 1800;        send_timeout 1800;        proxy_hide_header x_destination;        proxy_pass http://dashboardapp;    }    location /error_pages {        root /etc/nginx/;    }    error_page 495 496 497 /400_page.html;    location = /400_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 404 /404_page.html;    location = /404_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 500 /500_page.html;    location = /500_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 502 /502_page.html;    location = /502_page.html {        root /etc/nginx/error_pages;        internal;    }    error_page 503 /503_page.html;    location = /503_page.html {        root /etc/nginx/error_pages;        internal;    }}

总结

解决 Nginx 自定义 400 错误页面资源加载问题,关键在于正确处理 HTTP 和 HTTPS 请求。推荐的方法是配置一个 default_server 来处理所有未匹配的 HTTP 请求,并确保自定义错误页面中的资源路径使用绝对路径或相对于网站根目录的路径。避免在同一端口上同时处理 HTTP 和 HTTPS 请求,除非确实有必要,并充分了解其潜在的复杂性和性能影响。通过这些方法,可以确保自定义错误页面能够正常显示,提升用户体验。

以上就是解决 Nginx 自定义 400 错误页面资源加载问题(SSL)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1597575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
利用CSS优化表格单元格内伪元素对齐:实现稳定分隔线效果
上一篇 2025年12月23日 12:09:56
解决嵌套iframe中YouTube视频无法播放的指南
下一篇 2025年12月23日 12:10:15

相关推荐

  • Nginx跨域配置后,后端返回静态资源而非JSON数据是什么原因?

    Nginx跨域配置导致后端返回静态资源而非JSON数据的排查与解决 在前后端分离项目中,Nginx常用于解决跨域问题。然而,即使配置了Nginx跨域,前端仍可能收到错误的返回数据。本文分析一种常见错误:Nginx配置错误导致返回静态资源(如index.html)而非预期的JSON数据。 问题描述: …

    2026年8月31日
    000
  • 鸿蒙微信新版上线,负责人:目标对齐甚至超越iOS

    近日,鸿蒙微信手机版迎来了重要的功能更新。鸿蒙微信基础功能负责人anqi在接受采访时明确表示:“我们的终极目标是将鸿蒙微信做到与安卓、ios对齐,甚至最终超越ios。” 此次新版聚焦于社交体验的升级,重点完善了多项实用功能:群管理功能得到了优化,支持批量操作和自定义表情;用户可个性化设置“拍一拍”文…

    2026年8月31日
    000
  • 哔哩哔哩大会员专属功能在哪开启_B站会员专属功能开启指南

    开启B站大会员功能需依次设置:一、在“观看偏好”中设定清晰度为1080P+或自适应,开启自动跳过片头片尾及杜比全景声;二、在“隐私权限设置”中关闭个性化广告推荐,并于“播放设置”开启免广告播放;三、在“我的装扮”中领取大会员专属头像框、挂件并使用特效弹幕;四、在“账号与安全”中开启数据同步,实现多端…

    2026年8月31日
    000
  • ​​电脑无法复制粘贴?3种方法轻松解决​​

    电脑无法复制粘贴,这问题确实让人抓狂,它几乎是日常操作的基础。但通常来说,这并非什么大故障,多数时候都是些小毛病在作祟,几招就能搞定。 解决方案 遇到复制粘贴失灵,我的第一反应通常是这几步,屡试不爽: 重启电脑: 这是最简单也最有效的万能药。很多时候,系统内存或后台进程出现临时性紊乱,一个干净的重启…

    2026年8月31日
    000
  • Node.js究竟是什么样的运行环境?

    深入剖析Node.js:JavaScript服务器端运行环境 本文旨在深入浅出地解释Node.js作为JavaScript服务器端运行环境的具体含义,帮助开发者更好地理解这一概念。许多人初学Node.js时,常常对“运行环境”感到困惑。我们将从软件和硬件层面,以及与“运行时”(runtime)的关系…

    2026年8月31日
    000
  • 解决Laravel项目中CSS文件无法加载的问题

    解决Laravel项目中CSS文件无法加载的问题,需要具体代码示例 在开发Laravel项目的过程中,有时候会遇到CSS文件无法加载的问题,这可能会导致页面样式混乱或者无法正常显示页面内容。这个问题通常是由于文件路径配置或者缓存导致的,接下来我们将介绍几种常见的解决方法,并提供具体的代码示例。 一、…

    2026年8月31日
    000
  • 如何用Flexbox和JavaScript实现父元素内子元素的两行排列及展开显示?

    如何利用Flexbox和JavaScript在一个父元素内实现子元素的两行排列,并支持点击展开显示全部内容? 本文将演示如何使用Flexbox和JavaScript,在一个父容器中将多个子元素排列成两行,初始状态隐藏超出部分,点击按钮后显示所有内容并启用水平滚动条。 关键在于巧妙地结合CSS的Fle…

    2026年8月31日
    000
  • b站视频怎么循环播放_B站视频单曲循环播放设置技巧

    B站视频循环播放可通过三种方式实现:一是使用App内播放器的循环功能,点击进度条右侧循环图标即可;二是通过第三方播放器如VLC导入视频链接并开启循环模式;三是PC端利用浏览器扩展插件如Global Speed,启用Loop Video选项实现自动重播。 如果您希望在观看B站视频时实现循环播放,以便重…

    2026年8月31日
    200
  • 如何解决Laravel无法加载CSS样式的情况

    标题:如何解决Laravel无法加载CSS样式的情况 在使用Laravel进行Web开发的过程中,有时候会遇到CSS样式无法加载的情况,这可能会导致页面显示效果不正常。本文将介绍一些常见的原因以及解决方法,同时提供具体的代码示例供大家参考。 1. 检查CSS文件路径是否正确 首先要确保CSS文件路径…

    2026年8月31日
    100
  • Tailwind CSS hocus 变体失效:为什么按钮焦点状态下样式不生效?

    Tailwind CSS hocus 变体失效排查:焦点样式覆盖问题 使用 Tailwind CSS 时,变体(variants)用于控制样式在不同状态下的应用。然而,有时变体可能失效,例如 hocus 变体在按钮获得焦点时样式不生效。本文分析一个实际案例,解释 hocus 变体未能正确应用样式的原…

    2026年8月31日
    200
  • 如何在Java中使用LinkedHashSet

    LinkedHashSet继承HashSet并保持插入顺序,适用于去重且需顺序的场景。1. 创建时可指定初始容量;2. add()添加元素,自动去重;3. 遍历时按插入顺序输出;4. 支持remove()、contains()等操作;5. 常用于关键词去重、缓存等。注意:允许null、非线程安全。 …

    2026年8月31日
    200
  • 发布 ASP.NET Core 2.x 应用到 Ubuntu

    发布 ASP.NET Core 2.x 应用到 Ubuntu发布 ASP.NET Core 2.x 应用到 Ubuntu发布 ASP.NET Core 2.x 应用到 Ubuntu发布 ASP.NET Core 2.x 应用到 Ubuntu

    将asp.net core 2.x 应用发布到linux(ubuntu)服务器上时,通常采用kestrel作为服务器,因为它是跨平台的且高度优化。kestrel可以直接作为边缘服务器使用,但更推荐将其置于反向代理(如nginx)之后,以实现负载均衡和更好的扩展性。 在这种配置中,HTTPS请求首先到…

    2026年8月31日 用户投稿
    100
  • win10中文家庭版如何修改电脑账户名称?

    一、准备条件: 1. 一台安装了win10中文家庭版的设备 2. 足够的耐心与决心 二、操作步骤: 1. 进入系统“设置”界面,选择“账户”功能。 2. 在左侧菜单中点击“账户”进入相关页面,随后选择“你的信息”。 3. 在当前页面中找到并点击“管理我的Microsoft账户”选项。 4. 系统会跳…

    2026年8月31日
    100
  • 平安好车主如何预约汽车美容服务_平安好车主预约汽车美容服务详细方法

    首先打开平安好车主APP并登录,可通过首页活动入口、车主生活频道或服务预约中心三种方式进入汽车美容预约;选择所需服务项目后,选定附近门店及合适时间提交即可完成预约。 如果您想为您的爱车预约美容服务,但不确定如何在平安好车主APP中操作,可以通过以下多种方式完成预约。整个过程涉及选择服务项目、查找附近…

    2026年8月31日
    000
  • Webpack打包后,低版本浏览器为何无法识别Axios?

    Webpack打包项目后,部分低版本浏览器提示无法识别Axios,导致页面显示异常,即使将Axios版本降低至1.6.0也无济于事。此问题通常源于Babel的转译配置。本文将深入分析问题成因并提供解决方案。 问题:尽管babelrc文件已配置Babel预设和插件,目标浏览器涵盖IE9及以上版本和其他…

    2026年8月31日
    300
  • Vue应用部署到测试环境后SockJS-Node跨域报错如何解决?

    Vue应用测试环境部署:SockJS-Node跨域问题详解及解决方案 在Vue项目上线过程中,测试环境部署常常会遇到棘手问题。本文将针对一个典型的案例——“Vue应用部署到测试环境后,SockJS-Node出现跨域错误”进行深入分析和解决方案探讨。 问题描述: 一个基于Vue+Webpack构建的前…

    2026年8月31日
    100
  • 猫眼电影院取票机怎么用_猫眼影院自助取票机操作流程

    首先使用二维码扫码取票最便捷,到达影院后点击取票机“取票”按钮,将购票App中的动态二维码对准扫描口,听到“滴”声后等待电影票自动吐出;若无法扫码可选择输入手机号后四位及短信验证码的方式完成取票;此外还支持手动输入14或16位订单号查询并打印电影票。 如果您在猫眼App上购买了电影票,但需要在影院现…

    2026年8月31日
    000
  • 平安证券怎样设置止盈止损_平安证券APP智能条件单设置

    可通过平安证券APP的智能条件单实现自动买卖,具体包括:一、价格条件单,设定目标价触发买卖,登录APP后进入交易页面选择“价格条件单”,输入证券代码并设置高于或低于当前价的条件,完成委托信息后提交;二、回落卖出条件单,适用于上涨行情中锁定收益,进入“智能工具”选择“回落卖出”,设定回落幅度与卖出数量…

    2026年8月31日
    400
  • 悟空浏览器怎么样下载电视剧视频 视频下载设置及格式选择

    悟空浏览器能否下载电视剧视频取决于视频源网站的设置,其下载功能主要针对单个视频文件而非整部剧集,当访问支持下载的页面时,浏览器会在播放区域显示下载图标或提示,点击后可选择清晰度如标清、高清、超清等进行下载,下载格式通常为源站提供的原始格式如mp4、flv或webm,不支持格式转码,若下载按钮不出现或…

    2026年8月31日
    600
  • 高德鹰眼预警开启后电池消耗加快_高德鹰眼预警开启后电池消耗优化

    开启高德地图“鹰眼守护”后电池消耗加快,可通过调整运行模式、优化定位策略和启用省电功能缓解。1、将“高性能模式”改为“节能模式”,关闭非必要预警类型;2、定位模式设为“仅设备”或“省电模式”,允许后台活动并关闭位置记录;3、开启低电量动画关闭、智能预警间隔,关闭语音播报与AR导航,并定期清理缓存,有…

    2026年8月31日
    000

发表回复

登录后才能评论
关注微信