首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理nginx 400“简单的HTTP请求被发送到HTTPS端口”错误

处理nginx 400“简单的HTTP请求被发送到HTTPS端口”错误
EN

Stack Overflow用户
提问于 2012-01-07 18:21:33
回答 8查看 205.2K关注 0票数 134

我在passenger/nginx后面运行Sinatra应用程序。我正在尝试让它同时响应http和https调用。问题是,当两者都在服务器块中定义时,https调用可以正常响应,但http会产生一个400 "The plain HTTP request is sent to HTTPS port“错误。这是一个静态页面,所以我猜Sinatra与此无关。有什么办法解决这个问题吗?

下面是服务器模块:

代码语言:javascript
运行
复制
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;
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-01-11 06:53:39

我遇到了类似的问题。它可以在一台服务器上运行,但不能在另一台Nginx配置的服务器上运行。找到了由Igor here http://forum.nginx.org/read.php?2,1612,1627#msg-1627回答的解决方案

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

代码语言:javascript
运行
复制
server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}
票数 205
EN

Stack Overflow用户

发布于 2012-09-27 05:04:55

上述答案在大多数情况下是不正确的,因为它覆盖了“is this connection HTTPS”测试,以允许在http上提供寻呼,而不考虑连接安全性。

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

操作员应该使用:

代码语言:javascript
运行
复制
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://$server_name:$server_port$request_uri;

  [....]
}
票数 47
EN

Stack Overflow用户

发布于 2012-01-08 00:36:48

这个错误实际上说明了一切。您的配置告诉Nginx侦听端口80 (HTTP)并使用SSL。当你将浏览器指向http://localhost时,它会尝试通过超文本传输协议连接。因为Nginx需要SSL,所以它会报错。

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

代码语言:javascript
运行
复制
server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8768946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档