【问题标题】:Prevent nginx from removing CORS headers set by rack-cors防止 nginx 删除 rack-cors 设置的 CORS 标头
【发布时间】: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-Origin
  • Access-Control-Allow-Methods
  • Access-Control-Expose-Headers
  • Access-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


【解决方案1】:

我的site.conf

server {
  listen 80;
  server_name localhost;
  sendfile on;

  access_log /var/log/nginx/site.log;

  location /folderWithFiles/ {
        internal;
    set $access_control_expose_headers $upstream_http_access_control_expose_headers;
    set $access_control_allow_origin $upstream_http_access_control_allow_origin;
    set $access_control_allow_credentials $upstream_http_access_control_allow_credentials;
    set $access_control_allow_methods $upstream_http_access_control_allow_methods;
    set $access_control_allow_headers $upstream_http_access_control_allow_headers;

    add_header Access-Control-Expose-Headers $access_control_expose_headers;
    add_header Access-Control-Allow-Origin $access_control_allow_origin;
    add_header Access-Control-Allow-Credentials $access_control_allow_credentials;
    add_header Access-Control-Allow-Methods $access_control_allow_methods;
    add_header Access-Control-Allow-Headers $access_control_allow_headers;

    root /home/ilya/Projects/site/uploads/; 
    #result path /home/ilya/Projects/site/uploads/folderWithFiles/
  }

  location / {
    proxy_pass http://localhost:5252/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2017-11-18
    • 2016-04-26
    • 1970-01-01
    • 2012-08-27
    • 2020-05-01
    • 2012-05-01
    • 1970-01-01
    相关资源
    最近更新 更多