【问题标题】:Nginx server with both HTTP and HTTPS, browser selecting HTTP具有 HTTP 和 HTTPS 的 Nginx 服务器,浏览器选择 HTTP
【发布时间】:2016-01-21 14:50:13
【问题描述】:

我正在 Nginx 服务器上部署一个网络。 Nginx 配置了 http 和 https 两种版本,像这样:

upstream stream {
    server unix:///home/project/project.sock;
}

server {
    listen 443;

    ssl on;
    ssl_certificate certificate.crt;
    ssl_certificate_key server.key;

    server_name server.com;
    server_name *.server.com;
    client_max_body_size 0;
    charset utf-8;

    # Main
    location / {
        uwsgi_pass stream;

        # Parametros de uWSGI
        uwsgi_param  QUERY_STRING       $query_string;
        uwsgi_param  REQUEST_METHOD     $request_method;
        uwsgi_param  CONTENT_TYPE       $content_type;
        uwsgi_param  CONTENT_LENGTH     $content_length;

        uwsgi_param  REQUEST_URI        $request_uri;
        uwsgi_param  PATH_INFO                      $document_uri;
        uwsgi_param  DOCUMENT_ROOT      $document_root;
        uwsgi_param  SERVER_PROTOCOL    $server_protocol;

        uwsgi_param  REMOTE_ADDR        $remote_addr;
        uwsgi_param  REMOTE_PORT        $remote_port;
        uwsgi_param  SERVER_ADDR        $server_addr;
        uwsgi_param  SERVER_PORT        $server_port;
        uwsgi_param  SERVER_NAME        $server_name;

        uwsgi_param UWSGI_SCHEME    https;
    }
}

server {
    listen 80;
    server_name server.com;
    server_name *.server.com;
    client_max_body_size 0;
    charset utf-8;

    # Main
    location / {
        uwsgi_pass  stream;

        # Parametros de uWSGI
        uwsgi_param  QUERY_STRING       $query_string;
        uwsgi_param  REQUEST_METHOD     $request_method;
        uwsgi_param  CONTENT_TYPE       $content_type;
        uwsgi_param  CONTENT_LENGTH     $content_length;

        uwsgi_param  REQUEST_URI        $request_uri;
        uwsgi_param  PATH_INFO                      $document_uri;
        uwsgi_param  DOCUMENT_ROOT      $document_root;
        uwsgi_param  SERVER_PROTOCOL    $server_protocol;

        uwsgi_param  REMOTE_ADDR        $remote_addr;
        uwsgi_param  REMOTE_PORT        $remote_port;
        uwsgi_param  SERVER_ADDR        $server_addr;
        uwsgi_param  SERVER_PORT        $server_port;
        uwsgi_param  SERVER_NAME        $server_name;

        uwsgi_param UWSGI_SCHEME    http;
    }
}

一切正常,但是当你输入 server.com 时浏览器总是选择 HTTP 版本,我希望它默认选择 HTTPS 版本。

我该怎么做?

【问题讨论】:

    标签: django ssl nginx https uwsgi


    【解决方案1】:

    如果您只想通过 HTTPS 提供服务,那么您需要重定向 HTTP 服务器块中的所有 HTTP 请求:

    server {
        listen 80;
        server_name example.com *.example.com;
        return 301 https://$server_name$request_uri;
    }
    

    然后,您可以删除 HTTP 服务器中的所有其他配置,因为它永远不会被使用。

    【讨论】:

    • 我需要两个版本,因为我不希望 API 使用 HTTPS。
    • 在这种情况下,您无法阻止浏览器通过 HTTP 获取。您可以考虑将您的 API 保留在单独的仅 HTTP 子域中。
    【解决方案2】:

    您无法控制浏览器的功能(很遗憾);默认情况下,如果用户不键入 scheme(这是 URL 的 http:// 部分的技术名称);那么浏览器将默认为http。

    如果您只想通过 https:// 为网站提供服务,则必须将所有请求重定向到 https:// 版本。

    这里你必须小心,如果你按照solarissmoke 的建议实施盲重定向,任何 POST 请求都会失败并且无法正确重定向。

    一种更兼容的重定向方法是检查请求的类型:

    server {
        listen   80;
        server_name example.com;
    
        location / {
          if ($request_method = GET) {
            rewrite  ^ https://$host$request_uri? permanent;
          }
          return 405;
        }
    }
    

    然后您可以添加进一步的检查以仅将您想要的流量重定向到 https。

    【讨论】:

      【解决方案3】:

      我一直在使用以下方法:

      server {
          listen      80;
          server_name www.yourdomain.com *.yourdomain.com;
          rewrite     ^ https://$server_name$request_uri? permanent;
      }
      

      如果连接是正常的 http,则基本上将连接重定向到 https(安全 ssl)。 希望对你有帮助。

      【讨论】:

        【解决方案4】:

        找到答案,

        事实证明,可以同时拥有 HTTP 和 HTTPS 服务器并默认选择 HTTPS。我只需要将conf文件的两个服务器混合在一起,就像:

        server {
            listen 80;
            listen 443 default_server ssl;
        
            ssl_certificate certificate.crt;
            ssl_certificate_key server.key;
        
            server_name server.com;
            server_name *.server.com;
            client_max_body_size 0;
            charset utf-8;
        ...
        }
        

        【讨论】:

        • 我看不出这如何阻止浏览器请求 HTTP 连接?
        • @solarissmoke 我猜是因为“default_server”标签
        猜你喜欢
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 2010-09-20
        • 2013-11-14
        • 1970-01-01
        • 2020-05-03
        相关资源
        最近更新 更多