当使用http协议直接访问https端口时nginx会返回http 400状态码,同时显示400 Bad Request: The plain HTTP request was sent to HTTPS port,当使用非标https端口时这会直接暴露该端口为https端口,但如果我想尽量隐藏该https端口该如何操作呢?

一、nginx配置

# Forbidden Direct IP Access
server
{
    listen 80 default_server;
    http2 on;

    server_name _;

    return 444;

    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log;
}

server
{
    listen 443 default_server;
    http2 on;

    server_name _;

    error_page 497 = @refuse_access;

    location @refuse_access {
        return 444;
    }

    ssl_reject_handshake on;

    ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;

    access_log /var/log/nginx/access.log main;
    error_log  /var/log/nginx/error.log;
}

忽略http端口直接返回444状态而不是301转跳https的问题,首先分离http和https的server配置

error_page和location重定向方法参考这篇文章

二、测试

使用http协议访问https端口不再返回http 400错误,而是直接返回444状态码

三、参考文章

Nginx HTTPS 端口接收 HTTP 请求异常(The plain HTTP request was sent to HTTPS port)处理方案

文章作者:四文鱼Max

本文链接:https://blog.awolon.fun/archives/nginx-http-https-444.html

许可协议:CC BY-SA 4.0

标签: nginx

添加新评论