我正在进行不受支持的 Docker 安装。
这意味着在不同的端口上运行 Ember CLI 的容器,并使用共享卷,并通过反向代理到 Rails 服务器,正如预期的那样。
不幸的是,对于所有 .css 资源,当我通过 HTTPS 并通过 Nginx 反向代理访问时,都会收到来自 curl 和浏览器的“网关错误 502”。
看起来 Ember CLI 在 Rails 服务器已经添加了 transfer-encoding: chunked 的情况下,又 添加 了 Content-Length 标头。
(我可以访问不同的端口来检查来自 Rails 和 Ember 的响应)
我相信这并没有正式违反 HTTP 1.1 协议标准(它应该被忽略):
“如果收到的消息同时包含 Transfer-Encoding 标头字段和 Content-Length 标头字段,则后者必须被忽略。”
……但这确实会导致 Nginx 拒绝服务并报告 502,并且不提供资源,所以这无关紧要。
我可以直接通过 curl 将 CSS 文件浏览到本地主机上的容器,但在 Nginx 层面,它无法正常工作:
upstream 在读取来自上游的响应头时同时发送了“Content-Length”和“Transfer-Encoding”标头
有人有什么办法可以阻止 Ember CLI 这样做,或者有什么变通方法吗?我很惊讶这在标准安装中不是一个问题?(因为通信链应该非常相似)。
Discourse 版本是 2.8.9
Docker 中的标头(为简洁起见,略有删减):
< content-transfer-encoding: binary
< content-type: text/css; charset=utf-8
< referrer-policy: strict-origin-when-cross-origin
< set-cookie: __profilin=p%3Dt; path=/forum; HttpOnly; SameSite=Lax
< **transfer-encoding: chunked**
< Vary: Accept, Accept-Encoding
< x-content-type-options: nosniff
< x-discourse-route: stylesheets/show
< x-download-options: noopen
< x-frame-options: SAMEORIGIN
< x-permitted-cross-domain-policies: none
< x-xss-protection: 0
< content-encoding: null
< **Content-Length: 3055**
1 个赞
david
(David Taylor)
2
我们仅在开发环境中使用 Ember CLI 代理。在标准安装中,请求流程为 用户 → NGINX → Rails。我建议坚持这种模式——我们没有为生产环境设计我们的 Ember CLI 配置。即使您设法使其正常工作(这并不容易),也可能会存在安全和/或性能问题。
6 个赞
啊,嗯,这个安装目前是开发/生产混合体,所以它有像这样的环境变量:
RAILS_ENV: development
尽管它前面有完整的 HTTPS 和 Nginx。
但我可能会在“开发”中更改它,以便我们能够让事情正常工作。
是的,所以 Ember CLI 绝对还没有准备好投入生产,恕我直言,我只会将其用于“真正的”开发。
感谢您提供的重要信息 David,这为我节省了很多时间!
3 个赞
好的,这个故事,顺便说一句,变得更奇怪了。
我有两个安装,都是“开发”设置,一个是这个,另一个是非 Docker 的 Ubuntu 设置。
我注意到对非 Docker 开发服务器上的 /stylesheets/ 的调用不包含来自 Rails 服务器的“Transfer-Ecoding: chunked”标头,而是包含“Content-Length”值……有人能解释一下为什么会这样吗?
更新:这可能可以通过 https://stackoverflow.com/questions/29112728/when-does-rails-respond-with-transfer-encoding-vs-content-length 来解释。
1 个赞
我将编写一个小型插件来为样式表响应添加 Content-Length 标头,看看是否可以防止 Transfer-Encoding: chunked 响应。
如果有人知道更简单的实现方法,我洗耳恭听!
(供参考,这仅用于开发环境,绝不会在生产环境中使用)。
1 个赞
关于此事的更新。
我已经成功地欺骗了系统。我通过覆盖 StylesheetsController 来强制设置 Content-Length 标头,这可以防止分块响应,从而绕过 Ember CLI 的不良习惯并避免 nginx 的不规范过敏。
我之所以能找到这个解决方案,是因为我注意到了另一个使用 https 的 Ember CLI/nginx 设置,其中 Rails 选择不对 Stylesheet 响应进行分块(有人知道为什么会这样吗?)。这促使我尝试强制设置标头,结果它奏效了!
这仅在开发环境中需要,所以我不太担心。
2 个赞
system
(system)
关闭
7
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.