解决 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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 12:09:56
下一篇 2025年12月23日 12:10:15

相关推荐

  • css如何让文本不换行

    在css中,可以使用white-space属性来让文本不换行,只需要给文本文字元素添加“white-space:nowrap;”样式即可。white-space属性用于设置元素内的空白怎样处理,当值为“nowrap”时设置文本不换行。 本教程操作环境:windows7系统、CSS3&&amp…

    2025年12月24日
    000
  • 深入了解CSS中的@property特性

    本文主要讲讲 CSS 非常新的一个特性,CSS @property,它的出现,极大的增强的 CSS 的能力! 根据 MDN — CSS Property,@property CSS at-rule 是 CSS Houdini API 的一部分, 它允许开发者显式地定义他们的 CSS 自定…

    2025年12月24日 好文分享
    000
  • html+css如何实现自定义图片上传按钮

    本篇文章给大家详细介绍一下html+css实现自定义图片上传按钮的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 普通的input[type=‘file’]的效果很朴素 可以自定义一个file选择文件的按钮: 立即学习“前端免费学习笔记(深入)”; 思路为: 用定位将自定义的…

    2025年12月24日 好文分享
    000
  • css如何设置浮动

    在css中,可以使用float属性设置浮动,只需要给元素设置“float:left|right|none”即可;其中left表示向左浮动,right表示向右浮动,none表示元素不浮动,并会显示在其在文本中出现的位置。 本教程操作环境:windows7系统、CSS3&&HTML5版、…

    2025年12月24日
    000
  • 分享CSS处理图像上文字的几种小技巧

    本篇文章给大家介绍一下使用css处理图片上文字的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 做项目过程中,我们可能会遇到这样的一个组件,该组件的图像上方是文本。 在某些情况下,根据所使用的图像,文字难以阅读,如文字是白色的,背景图偏浅。 这种情况有一些不同的解决方案,例如…

    2025年12月24日 好文分享
    000
  • css如何取消加粗

    在css中,可以使用font-weight属性取消加粗,只需要给元素设置“font-weight:normal”样式即可;font-weight属性用于设置显示元素的文本中所用的字体粗细,当值为normal时为默认值,表示定义标准的字符。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日 好文分享
    000
  • css中div高度怎么设置

    在css中,可以使用height属性来设置div高度,只需要给div元素添加“height:高度值;”样式即可。height属性可以设置元素的高度,定义的是元素内容区的高度,不包括填充,边框,或页边距。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电…

    2025年12月24日
    000
  • css如何设置最小高度

    在css中,可以使用“min-height”属性设置最小高度,语法“min-height:值”。min-height属性设置元素的最小高度,该属性值会对元素的高度设置一个最低限制,能够防止height属性的应用值小于min-heigh的值。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css如何设置td宽度

    在css中,可以使用width属性设置td宽度,只需要给td元素设置“width:宽度值;”样式即可。width属性设置元素的宽度,该属性定义元素内容区的宽度,在内容区外面可以增加内边距、边框和外边距。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电…

    2025年12月24日
    000
  • css如何设置宋体

    在css中,可以使用font-family属性设置宋体,只需要给元素设置“font-family:”宋体”;”样式即可。font-family属性允许通过给定一个有先后顺序,由字体名或者字体族名组成的列表来为选定的元素设置字体。 本教程操作环境:windows7系统、CSS3…

    2025年12月24日
    000
  • css如何设置粗体

    在css中,可以使用“font-weight”属性设置粗体,只需要给元素设置“font-weight:bold|700”样式即可。font-weight属性设置文本的粗细,数字值700等价于bold,当值为bold时,表示定义粗体字符。 本教程操作环境:windows7系统、CSS3&&am…

    2025年12月24日 好文分享
    000
  • css如何改变svg颜色

    在css中,可以使用stroke属性改变svg颜色,只需要给svg中的polyline标签设置“stroke:颜色值”样式即可。stroke属性定义一条线,文本或元素轮廓颜色,值和color一样,支持rgba透明通道。 本教程操作环境:windows7系统、CSS3&&HTML5版、…

    2025年12月24日
    000
  • css怎么让div隐藏

    css让div隐藏方法:1、使用“display:none;”语句;2、使用“visibility:hidden;”语句;3、使用“opacity:0;”语句;4、使用“position:absolute;top:-9999px;”语句。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日 好文分享
    000
  • css段落间距怎么设置

    设置方法:1、使用line-height属性设置,语法“line-height:高度值”;2、使用padding设置段落上下间距,语法“padding:间距值 0”;3、使用margin设置上下段落间距,语法“margin:间距值 0”。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • css怎么隐藏滚动条

    方法:1、将滚动条宽度设置为none,语法“scrollbar-width:none;”;2、使用“-ms-overflow-style:none;”语句;3、使用“::-webkit-scrollbar{display:none}”语句。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css怎么设置图片背景

    css设置图片背景的方法:1、使用background-image属性,语法“background-image:url(‘图片地址’);”;2、使用background属性,语法“background:url(‘图片地址’);”。 本教程操作环境:wi…

    2025年12月24日 好文分享
    000
  • css如何设置div大小

    在css中,可以使用width属性和height属性来设置div大小,只需要给div元素设置“width:值”和“height:值”样式即可。width属性定义元素内容区的宽度,height属性定义元素内容区的高度。 本教程操作环境:windows7系统、CSS3&&HTML5版、D…

    2025年12月24日
    000
  • css怎么设置间距

    css设置间距的方法:1、使用letter-spacing属性设置字间距;2、使用line-height属性设置行间距,即行高;3、使用margin或padding属性设置段落间距或元素之间的距离。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。…

    2025年12月24日 好文分享
    000
  • css怎么把文字居中

    文字居中的方法:1、使用“text-align:center;”语句设置水平居中;2、利用CSS3的flex布局设置垂直居中;3、使用“vertical-align:middle;display:table-cell;”语句设置垂直居中。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日 好文分享
    000
  • css如何设置对齐

    设置方法:1、使用“margin:0px auto”语句设置水平对齐;2、使用position属性,配合top、bottom、left和right属性设置左或右对齐;3、使用“float:right|left”语句设置左或右对齐。 本教程操作环境:windows7系统、CSS3&&H…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信