情况:
正在开发插件,并使用 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 正常工作。
这已经阻碍了开发进度,感觉像是撞上了南墙
有没有办法直接在 Discourse 的配置文件(或者更好的是在插件中)添加这些头信息,以便在开发环境中发送我们想要测试的各种 HTTP 头?
或者,是否有可能让 rack-cors gem 正常工作?如果可以,我应该将代码添加到插件的哪个位置?
参考:RubyDoc.info: File: README – Documentation for rack-cors (0.4.0) – RubyDoc.info
如前所述,我之前尝试的许多方法以及 rubydocs 中提到的那些方案,最终都显示“此处未生效”,老样子,老样子。
甚至试过暂时忽略 CORS 问题,只添加一个 HTTP 缓存头,但在我这里也走到了死胡同。
我猜大家都会对这些 CORS 相关问题一笑置之,我也是;但如果你能告诉我如何在开发测试环境中添加自己的测试头(无论是 CORS 还是其他),我将不胜感激。
谢谢。
sam
(Sam Saffron)
2020 年5 月 18 日 05:38
2
请问我们的标准 CORS 支持和 cors_origins 站点设置为何对您无效?
def call(env)
cors_origins = @global_origins || []
cors_origins += SiteSetting.cors_origins.split('|') if SiteSetting.cors_origins.present?
cors_origins = cors_origins.presence
if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
end
env[Discourse::Cors::ORIGINS_ENV] = cors_origins if cors_origins
status, headers, body = @app.call(env)
headers ||= {}
Discourse::Cors.apply_headers(cors_origins, env, headers) if cors_origins
[status, headers, body]
end
This file has been truncated. show original
1 个赞
你好 @sam
我不知道为什么内置的 CORS 支持对我无效,但我已经尝试了许多条目,包括这类 通配符 条目。也许是我操作有误?
抱歉,我在原始帖子中已经提到过这一点……
sam:
if env['REQUEST_METHOD'] == ('OPTIONS') && env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
return [200, Discourse::Cors.apply_headers(cors_origins, env, {}), []]
end
也许我需要设置这个环境变量?
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 显示这些设置是正确的……但控制台中仍然出现可怕的“访问被拒绝”错误