在 Apache 中启用了 CORS,但 AJAX 不起作用(chrome 表示不允许来源)

Posted

技术标签:

【中文标题】在 Apache 中启用了 CORS,但 AJAX 不起作用(chrome 表示不允许来源)【英文标题】:CORS enabled in Apache, but AJAX not working (chrome says origin not allowed) 【发布时间】:2012-08-22 01:18:48 【问题描述】:

我正在尝试让一些 AJAX 在两个子域之间工作。

rails.mydomain.com 和 mydomain.com

在 apache 中,在 /etc/apache2/sites-available/ 我有我的 rails.mydomain.com 文件:

<VirtualHost *:80>
    Header add Access-Control-Allow-Origin "http://www.mydomain.com"
    Header add Access-Control-Allow-Origin "http://www.dev-mydomain.com"
</VirtualHost>

但是,每当我尝试从 http://www.dev-mydomain.com 发出简单的 ajax 测试请求时,在 Chrome 中我会得到:"XMLHttpRequest cannot load http://rails.mydomain.com/directory. Origin http://www.dev-mydomain.com is not allowed by Access-Control-Allow-来源。”

有人知道我错过了什么吗?

【问题讨论】:

查看Access-Control-Allow-Origin multiple origin domains 好的,所以我之前确实看到过该帖子,但我遵循了关于执行两个“标题添加”语句的响应。我删除了第二个 add 语句,只设置了一个 Header 并且它可以工作,但是,我最终需要有两个来源......我应该只做两个 set 语句,或者该帖子中的哪个解决方案是最好的方法跨度> 是的,它不止一个设置。谷歌需要尽快解决这个问题。他们不是一开始就发明了ajax吗? 【参考方案1】:

我已经使用rack-cors 取得了一些成功,在做跨域ajax 时添加非常简单......

【讨论】:

【参考方案2】:

你可以试试这个吗?

到 Gemfile

gem "rack-cors", "~> 0.2.7"

config/application.rb

config.middleware.use Rack::Cors do |requests|
  requests.allow do |allow|
    allow.origins '*'
    allow.resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options]
  end
end

不要忘记重启服务器。那么它应该是工作。

【讨论】:

这不会降低服务器的安全性吗?【参考方案3】:

正如 Dahazer 的链接所指出的,最好的办法是设置一个 Access-Control-Allow-Origin 标头。这绝对不适合生产,但您可以在开发模式下回显 Origin 标头。

如果您仍有问题,可能是您在响应中设置的 CORS 标头不够多。根据我在 chrome 中做跨域 ajax 的经验(不使用 jquery mind),我还需要设置以下标题:

Access-Control-Allow-Headers : X-Requested-With,Content-Type

鉴于我使用的是 POST 和 GET 以外的 HTTP 方法,因此我也需要设置

Access-Control-Allow-Methods : GET,PUT,POST,DELETE

不过,最重要的是,我建议阅读 html5 CORS 教程,尤其是 CORS on the server 部分。 它应该让您了解配置 CORS 的不同方法,无论是在服务器上还是在客户端(在您的情况下为 jquery 的 ajax 配置选项),具体取决于您的特定用例。

【讨论】:

【参考方案4】:

我最近遇到了这个问题。我在 Apache 中将 Access-Control-Allow-Origin 设置为 *。然而,Chrome 仍然阻止我的跨域请求,而它在 Firefox 中运行良好。

对我有用的解决方案是添加一个 Access-Control-Allow-Methods 标头,其值为 OPTIONS, GET, POST。在这里发布这个,以防将来有人遇到同样的问题并且其他解决方案都不起作用。

【讨论】:

如果你描述了 where 放置 Access-Control-Allow-Methods 会很有帮助。 它应该在您的服务器针对特定 CORS 请求返回的响应的响应标头中。【参考方案5】:

问题可能出在 4 个不同的地方。让我们从您的&lt;virthualhost 定义开始。首先,您需要一些模块和配置设置才能让您的虚拟主机定义实现这些设置。

确保mod_headers 已启用 确保您的主要 apache 配置文件有一个 AllowOverride 设置,允许您的虚拟主机覆盖您的默认 CORS 设置

完成这两项后,您可以使用Access-Control-Allow-Origin 设置,前提是您还使用DocumentRoot 指令

<VirtualHost *:80>
    DocumentRoot /server/path/to/site/root
    Header add Access-Control-Allow-Origin "mydomain.com"
    Header add Access-Control-Allow-Origin "dev-mydomain.com"
    Header set Access-Control-Allow-Methods "GET,POST,PUT,OPTIONS"
</VirtualHost>

【讨论】:

以上是关于在 Apache 中启用了 CORS,但 AJAX 不起作用(chrome 表示不允许来源)的主要内容,如果未能解决你的问题,请参考以下文章

在 .ajax POST 中启用 CORS

如何在ajax中启用cors?

Bottle Py:为 jQuery AJAX 请求启用 CORS

Docker Registry 2.0 启用 CORS

Angular资源如何保留ajax标头并同时启用cors

带有自定义标头的 Ajax 请求发送到启用 CORS 的 Web API 服务器