在 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 个不同的地方。让我们从您的<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 表示不允许来源)的主要内容,如果未能解决你的问题,请参考以下文章