【发布时间】:2019-07-17 10:43:35
【问题描述】:
上下文
我使用 Docker 部署我的 Rails 应用程序,并使用 nginx 容器作为我的前端 HTTP 服务器。
我在 Rails 中配置 rack-cors 以发送一些 URL 的 CORS 标头。
我的应用程序可以使用 2 个使用 HTTPS 的不同域,在 nginx 中配置为 2 个不同的 server 配置。第一个配置为default_server。
nginx 和 Rails 之间的内部通信使用 HTTP。 HTTPS 只在 nginx 中配置。
明确地说,我所说的 CORS 标头是指:
Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Expose-HeadersAccess-Control-Max-Age
我正在使用 rack-cors 1.0.2 和 nginx 1.16.0。
我创建了a Gist with my nginx configuration。
问题
当使用 HTTPS 使用第二个域时,我由 rack-cors 设置的 CORS 标头被 nginx 删除。
我知道它们已被删除,因为我监控了多项内容:
- 我将 rack-cors 置于调试模式,它会在 Rails 日志中正确输出 CORS 标头。
- 我从 nginx 容器中直接向 Rails 执行查询,响应包含 CORS 标头。
- 我使用 tcpdump 监控了 nginx 对 Rails 的查询/响应,响应包含 CORS 标头。
但是 nginx 对最终用户的响应不包含 CORS 标头。
一直以来,为第一个域发送的响应都是正常的,并且包含 CORS 标头。
问题
- 为什么 nginx 从上游响应中删除这些标头?
- 如何在 nginx 中监控这种行为?
- 如何防止 nginx 重写这些响应?
谢谢
【问题讨论】:
-
什么是 nginx 配置?
-
@PavelMikhailyuk 这是我的配置文件的要点:gist.github.com/genezys/5c2ae32bfe6e454dc380c196fb543951
-
只有那些被丢弃的 Access-Control-* 标头吗?还是在 Rails 上游端设置的其他标头也被丢弃了?
-
似乎所有标题都被删除了。进一步调查表明,它与
X-Accel-Redirect有关。当我触发internal位置时,标头会被删除,并且 nginx 似乎正在根据发送的文件使用自己的一组标头。 -
stackoverflow.com/a/24509358/441757 的答案似乎可能相关:由于
X-Accel-Redirect导致内部重定向,nginx 不会发送返回的标头,但会将它们保留在$upstream_http_...变量中。或者serverfault.com/a/957377/306824 的答案可能是:您应该确保将请求标头从浏览器传递到 S3,并在location中使用proxy_pass_request_headers on;。此外,您可能不应该为location定义internal。
标签: ruby-on-rails nginx cors x-accel-redirect rack-cors