Nginx服务器同时使用HTTP和HTTPS,浏览器选择HTTP

时间:2015-10-22 10:40:51

标签: django ssl nginx https uwsgi

我在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版本。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

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

File file = new File(dirFileName);
        file.delete();
        file.createNewFile();
        DataOutputStream dataOut = new DataOutputStream(new FileOutputStream(file));
        dataOut.writeBytes(view);

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

答案 1 :(得分:1)

您无法控制浏览器的功能(不幸的是);默认情况下,如果用户未键入 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的流量。

答案 2 :(得分:1)

我一直在使用以下方法:

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

如果连接是正常的http,基本上将连接重定向到https(secure ssl)。 我希望它有所帮助。

答案 3 :(得分:0)

找到答案,

原来可以同时拥有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;
...
}