HTTP解析错误,请求格式不正确 - Ruby on Rails

29

当我尝试运行一个Ruby on Rails应用程序时,终端中出现以下错误。

HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.>
2017-03-12 13:10:02 -0400: ENV: {"rack.version"=>[1, 3], "rack.errors"=>#<IO:<STDERR>>, "rack.multithread"=>true, "rack.multiprocess"=>false, "rack.run_once"=>false, "SCRIPT_NAME"=>"", "QUERY_STRING"=>"", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_SOFTWARE"=>"puma 3.4.0 Owl Bowl Brawl", "GATEWAY_INTERFACE"=>"CGI/1.2"}

浏览器错误:
This site can’t provide a secure connection. localhost sent an invalid response. ERR_SSL_PROTOCOL_ERROR*

我尝试了以下方法:

  • 清除浏览器缓存并重新启动
  • 回退到一个在GIT中工作的旧提交
  • 重新启动终端
  • 运行一个功能正常的不同rails应用程序

首先,删除Chrome的所有缓存。这对我很有效。 - sonicmario
8个回答

36

以下是一些可能的解决方案。

  1. 确保您连接的是 http://localhost:3000 而不是 https://localhost:3000

  2. 如果浏览器重定向到 HTTPS,且使用的是 Google Chrome,请尝试这个解决方案,它可以解决一个HSTS问题:https://dev59.com/c18e5IYBdhLWcg3w4dik#28586593

  3. 确保您没有在生产环境(如果是这样的话)强制使用HTTPS。如果是这个问题,请注释掉或将true 改为 false

    config/environments/production.rb

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true

2
谢谢你的提醒,我这个笨蛋一直在使用https而不是http。 - NemyaNation
1
我花了一分钟才意识到我正在访问 https 而不是 http,多亏了 Chrome 愚蠢的协议隐藏。 - David Gay
1
请确保您连接的是 http://localhost:3000 而不是 https://localhost:3000,这对我解决了问题。 - Mayuresh Srivastava
@NemyaNation 谢谢你的评论,我也很愚蠢,使用了本地主机的https。 - Pavan Kumar V

7
如果你在未来阅读这篇文章,请考虑以下几点:
1. 你是否在Gemfile中更改了服务器,例如从Puma到Thin? 2. 是否已经设置了SSL证书? 3. 是否在启动Web服务器时使用了SSL证书标志? 4. 在您的开发/生产环境中是否打开了SSL - 以及你正在调用哪个环境?
如果您同意在开发环境中关闭SSL,则可以通过转到 “config/environments/development.rb”,并配置:
``` config.force_ssl = false ```
以下是一些对我有用的代码,使用puma调用SSL证书(本地)。我已经创建了我的证书并将其存储在相关位置:
``` rails s -b 'ssl://localhost:3000?key=./. ssl/localhost.key&cert=./. ssl/localhost.crt' ```
当我想要在我的PC上的生产环境中运行它时,我使用以下命令:
``` rails s -b 'ssl://localhost:3000?key=./. ssl/localhost.key&cert=./. ssl/localhost.crt' -e production ```
希望对你有所帮助。

6
看起来你正在尝试在本地上运行HTTPS。你需要在本地安装一个TLS工具包(例如openSSL)。 例如OPENSSL
在确认安装了该工具包之后,如果仍然无法正常工作,也许你可以在下一个GitHub问题中找到答案。似乎是Puma gem的一个错误。 GITHUB ISSUE TALK

2
如果以上解决方案不起作用,可以快速检查一下你的application.html.erb文件中是否有以下meta标签: <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> 这将强制Google Chrome将localhost重定向到HTTPS。

1
在我的情况下,这是一个愚蠢的错误,我在http上启动了服务器,而我的url指向https。希望能节省其他人的时间;)

1

使用其他浏览器访问该应用程序,或者如果您在Chrome中访问它,请使用隐身模式。之后,错误不再在任何浏览器中显示。请记住,在development.rb文件中首先删除config.force_ssl或将其设置为false

今天在我们的Rails 6应用程序的development.rb文件中添加和删除config.force_ssl = true配置后遇到了这个问题。尝试在本地主机上的Chrome浏览器中访问该应用程序,但仍然显示相同的错误。多次重启rails服务器,但无济于事。

在从未打开过应用程序客户端的强制ssl版本的不同浏览器中访问它可以解决问题。


0

在运行RAILS_ENV=production rails server之后,我遇到了这个问题。

在隐身模式或使用非Chrome浏览器时,本地主机应该能够正常工作。

解决方法的三个步骤

  1. 在隐身模式下打开https://localhost:3000(使用https版本)
  2. 打开开发者工具(在Mac上按cmd + opt + j
  3. 强制刷新页面。可以通过按下cmd + shift + r或按住Shift键点击刷新按钮来进行操作。
  4. 现在访问http://localhost:3000(http版本),页面应该会正常加载

此信息来源于此处

注意事项

曾经有一次我在生产环境中使用调试器,不知何故出现了相同的错误。以下是似乎解决了问题的方法:

  1. 将此内容放入地址栏并按回车:
chrome://settings/content/all?search=cookies

2. 找到生产网站的 cookie(s),并将其删除。 3. 访问本地主机,看看现在是否正常工作。 4. 你还需要关闭并重新打开 Chrome。

0
如果您正在通过 action_dispatch.default_headers 为您的应用程序设置 Content-Security-Policy:
  config.action_dispatch.default_headers = ({
      'Content-Security-Policy' => "default-src 'self' https:;\
        font-src 'self' https: data:;\
        img-src 'self' https: data: blob:;\
        object-src 'self';\
        script-src 'self' https: 'unsafe-inline' 'unsafe-eval';\
        style-src 'self' https: 'unsafe-inline';\
        upgrade-insecure-requests;\
        frame-ancestors *"
    })

请确保在您的开发环境中覆盖该设置,以添加http选项。像这样:

  config.action_dispatch.default_headers = ({
    'Content-Security-Policy' => "default-src 'self' http: https:;\
      font-src 'self' http: https: data:;\
      img-src 'self' http: https: data: blob:;\
      object-src 'self';\
      script-src 'self' http: https: 'unsafe-inline' 'unsafe-eval';\
      style-src 'self' http: https: 'unsafe-inline';\
      frame-ancestors *"
  })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接