处理nginx 400“普通的HTTP请求被发送到HTTPS端口”错误

时间:2012-01-07 10:21:33

标签: nginx

我在乘客/ nginx后面运行一个Sinatra应用程序。我试图让它响应http和https调用。问题是,当两者都在服务器块中定义时,https呼叫正常响应但http产生400“普通HTTP请求被发送到HTTPS端口”错误。这是一个静态页面,所以我猜Sinatra与此无关。关于如何解决这个问题的任何想法?

这是服务器块:

server {
        listen 80;
        listen 443  ssl;
        server_name localhost;
        root /home/myhome/app/public;
        passenger_enabled on;

        ssl on;
        ssl_certificate      /opt/nginx/ssl_keys/ssl.crt;
        ssl_certificate_key  /opt/nginx/ssl_keys/ssl.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!aNULL:!MD5;

        location /static {
            root  /home/myhome/app/public;
            index  index.html index.htm index.php;
        }

        error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 /500.html;

        access_log /home/myhome/app/logs/access.log;
        error_log /home/myhome/app/logs/error.log;
}

8 个答案:

答案 0 :(得分:186)

我遇到了类似的问题。它适用于一台服务器,不适用于具有相同Nginx配置的其他服务器。找到了Igor在http://forum.nginx.org/read.php?2,1612,1627#msg-1627

回答的解决方案

是。或者您可以在一台服务器中组合SSL /非SSL服务器:

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}

答案 1 :(得分:30)

以上答案是错误的,因为大多数覆盖'这是连接HTTPS'测试,以允许通过http提供页面而不管连接安全性。

安全答案使用NGINX特定的http 4xx错误代码上的错误页面重定向客户端以重试相同的请求到https。 (如此处所述https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx

OP应该使用:

server {
  listen        12345;
  server_name   php.myadmin.com;

  root         /var/www/php;

  ssl           on;

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$host:$server_port$request_uri;

  [....]
}

答案 2 :(得分:16)

错误说明了一切。您的配置告诉Nginx侦听端口80(HTTP)并使用SSL。当您将浏览器指向http://localhost时,它会尝试通过HTTP进行连接。由于Nginx需要SSL,因此会抱怨错误。

解决方法非常简单。您需要两个server部分:

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}

答案 3 :(得分:12)

我有完全相同的问题,我有与你的例子相同的配置,我通过删除该行来实现它:

ssl on;

引用文档:

  

如果HTTP和HTTPS服务器相同,则可以通过删除指令“ssl on”并为*:443 port添加ssl参数来配置处理HTTP和HTTPS请求的单个服务器

答案 4 :(得分:7)

以下示例在 ipv6 支持的同一配置块中配置 HTTP HTTPS 。配置在 Ubuntu Server NGINX / 1.4.6 中进行测试,但这适用于所有服务器。

server {
    # support http and ipv6
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # support https and ipv6
    listen 443 default_server ssl;
    listen [::]:443 ipv6only=on default_server ssl;

    # path to web directory
    root /path/to/example.com;
    index index.html index.htm;

    # domain or subdomain
    server_name example.com www.example.com;

    # ssl certificate
    ssl_certificate /path/to/certs/example_com-bundle.crt;
    ssl_certificate_key /path/to/certs/example_com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;
}

不要包含可能导致ssl on错误的400。上面的配置适用于

  

http://example.com

     

http://www.example.com

     

https://example.com

     

https://www.example.com

希望这有帮助!

答案 5 :(得分:4)

如果使用phpmyadmin add:fastcgi_param HTTPS on;

答案 6 :(得分:3)

实际上你可以这样做:

ssl off; 

这解决了我使用nginxvhosts的问题;现在我可以使用SSL和普通HTTP。 甚至与组合端口一起工作。

答案 7 :(得分:0)

参考 https://serversforhackers.com/c/redirect-http-to-https-nginx

我有类似的问题

http://www.example.com给出400 error The plain HTTP request was sent to HTTPS 但是

如果我输入https://www.example.com可以正常工作,

当用户输入以下命令时,我想自动将http重定向到https: http://www.example.com

解决方案是

我制作了两个服务器块,一个用于端口80,另一个用于443 SSL 在端口80块中,请按照以下步骤操作

server {
    listen 80;

    server_name example.com, www.example.com;

    return 301 https://$host$request_uri;
}

和另一个用于ssl配置的端口443的服务器块

server {
    location = /favicon.ico { access_log off; log_not_found off; }


    listen [::]:443 ipv6only=on default_server ssl;
    listen 443 ssl;
    ssl on;
    ssl_certificate /home/hemanth/vtuallinoneresources_com/example.crt;
    ssl_certificate_key /home/hemanth/ssl/example.com.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name www.example.com;
    // continure rest code...
}