Nginx L4 代理适用于 HTTPS,但不适用于 HTTP

Nginx L4 代理适用于 HTTPS,但不适用于 HTTP

我有以下配置作为 Nginx 上的 L4 代理,并且一切运行正常。

  stream {
 

    
    map $ssl_preread_server_name $name {
    hostnames;
    .ipchicken.com          $ssl_preread_server_name;
    .bbc.com                $ssl_preread_server_name;
    .bbc.co.uk              $ssl_preread_server_name;
    .bbci.co.uk             $ssl_preread_server_name;
    .neverssl.com           $ssl_preread_server_name;  #<-------
    
}


server {

    resolver 8.8.8.8;
    listen 443;
    ssl_preread on;
    proxy_connect_timeout 5s;
    proxy_pass $name:$server_port;
}

但是当请求 HTTP 站点时,例如“http://neverssl.com/”,Nginx 没有响应。对这个问题有什么想法吗?

答案1

据我所知,ssl_preread指令仅适用于 HTTPS 协议。我不知道如何Host在中获取 HTTP 标头值ngx_stream_core_module。您可以尝试server在中使用附加块http上下文如图所示这里

http {
    ...
    map $http_host $proxy {
        hostnames;
        .neverssl.com    $http_host;
        ...
    }

    server {
        listen 80;
        resolver 8.8.8.8;
        location / {
            if ($proxy = '') { return 403; } # Return HTTP 403 Forbidden for unlisted domains
            proxy_set_header Host $proxy;
            proxy_redirect off;
            proxy_connect_timeout 5s;
            proxy_pass http://$proxy;
        }
    }
}

stream {
    ... # stream configuration for HTTPS port 443 here
}

无需$server_port在流服务器块中使用变量,您只监听 443 端口,因此您只需使用proxy_pass $name:443;

相关内容