在开发中为插件添加 HTTP 标头

情况:

正在开发插件,并使用 nginx 作为反向代理指向 rails:3000,一切运行良好,但在访问 API 时遇到了令人头疼的 CORS 错误,这可是大家都“熟悉又热爱”的问题:

Access to XMLHttpRequest at 'blah blah blah' from origin 'foo bar bing' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

目前为止,我尝试在 nginx 中添加响应头,但不知为何,在 Chrome 调试时这些头信息并未出现。

也尝试过让 nginx 修改来自 Rails 的 proxy_headers 并传递给 nginx,但同样没有成功。

还尝试过使用 Chrome 扩展插件来插入这些头信息,但似乎也不起作用,尽管使用 CORS 测试网站对浏览器进行 CORS 测试时显示一切都被允许。

接着,我尝试添加 rack-cors gem,但由于出现 freeze 错误,无法让 config.middleware 正常工作。

这已经阻碍了开发进度,感觉像是撞上了南墙 :frowning:

有没有办法直接在 Discourse 的配置文件(或者更好的是在插件中)添加这些头信息,以便在开发环境中发送我们想要测试的各种 HTTP 头?

或者,是否有可能让 rack-cors gem 正常工作?如果可以,我应该将代码添加到插件的哪个位置?

参考:RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info

如前所述,我之前尝试的许多方法以及 rubydocs 中提到的那些方案,最终都显示“此处未生效”,老样子,老样子。

甚至试过暂时忽略 CORS 问题,只添加一个 HTTP 缓存头,但在我这里也走到了死胡同。

我猜大家都会对这些 CORS 相关问题一笑置之,我也是;但如果你能告诉我如何在开发测试环境中添加自己的测试头(无论是 CORS 还是其他),我将不胜感激。

谢谢。

请问我们的标准 CORS 支持和 cors_origins 站点设置为何对您无效?

1 个赞

你好 @sam

我不知道为什么内置的 CORS 支持对我无效,但我已经尝试了许多条目,包括这类 通配符 条目。也许是我操作有误?

抱歉,我在原始帖子中已经提到过这一点……

也许我需要设置这个环境变量?

  if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
    return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
  end

我需要设置一些环境变量吗?如果需要,在哪里设置?也许这是我的问题?

谢谢!

顺便说一句,我在插件初始化器中设置了以下内容:

Discourse.SiteSettings.discourse_enable_cors = true;
Discourse.SiteSettings.discourse_cors_origin = "*";

并且 console.log 显示这些设置是正确的……但控制台中仍然出现可怕的“访问被拒绝”错误 :frowning: