如何通过Nginx实现访问http://ex.com:443时展示自定义页面?
Nginx 443端口非SSL请求自定义错误页配置问题解决
问题根源
- 第一个server块失效/报错:
listen 443未指定ssl参数时,nginx对该端口的处理逻辑混乱——既不启用SSL,又无法正确处理明文HTTP请求,导致reload时可能出现配置冲突,且错误页规则无法触发。 - 第二个server块error_page不生效:当用HTTP协议访问443端口时,SSL握手直接失败,nginx还未进入该server块的请求处理流程,内部的
error_page规则根本不会执行。
修正后的配置
http{ # 专门处理HTTP请求访问443端口的场景 server { listen 443; server_name _; # 匹配所有未被精准匹配的请求 return 400 /error.html; location = /error.html { root /app; internal; } } server{ listen 443 ssl; server_name ex.ex.or.kr; ssl_certificate /etc/nginx/ssl/a.pem; ssl_certificate_key /etc/nginx/ssl/b.pem; ssl_session_timeout 5m; # 修复原配置的拼写错误:tiemout → timeout ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:MEDIUM:!SSLv2:!PSK:!SRP:!ADH:!AECDH; ssl_prefer_server_ciphers on; # 处理该server内合法SSL请求中的400错误 error_page 400 /error.html; location = /error.html{ root /app; internal; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; proxy_pass http://127.0.0.1:80/; proxy_redirect off; } } }
关键说明
- 优先匹配非SSL请求:第一个server块用
server_name _捕获所有未匹配到ex.ex.or.kr的请求(包括HTTP访问443的情况),直接返回400并跳转至自定义错误页,绕过SSL握手环节。 - 修复拼写错误:原配置中的
ssl_session_tiemout是无效参数,修正为ssl_session_timeout后才能正常reload。 - SSL握手失败的处理:如果是客户端发起SSL握手但失败(如证书不匹配),第二个server块内的
error_page会生效;纯HTTP请求则由第一个server块处理。
验证步骤
- 执行
nginx -t检查配置语法是否正确。 - 执行
nginx -s reload重新加载配置。 - 访问
http://ex.ex.or.kr:443,确认自定义错误页正常显示。
内容的提问来源于stack exchange,提问作者HyunJun
相关产品推荐
相关产品推荐

