在Apache中启用了CORS,但是AJAX无法正常工作(chrome说不允许来源)

时间:2012-08-27 14:23:48

标签: jquery ruby-on-rails ajax apache cors

我正在尝试在两个子域之间运行一些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无法加载http://rails.mydomain.com/directory。来源http://www.dev-mydomain.com不允许访问控制允许来源“。

任何人都知道我错过了什么?

5 个答案:

答案 0 :(得分: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配置选项)。

答案 1 :(得分: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

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

答案 2 :(得分:2)

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

对我有用的解决方案是添加值为Access-Control-Allow-Methods的{​​{1}}标头。在此处发布此信息,以防将来任何人遇到相同问题且其他解决方案均无效。

答案 3 :(得分:0)

我已经使用rack-cors取得了一些成功,在进行跨越原始的ajax时添加非常简单......

答案 4 :(得分:0)

这个问题可能出在4个不同的地方。让我们从您的<virthualhost定义开始。首先,您需要拥有一些模块和配置设置,甚至允许您的vhost定义实现这些设置。

  • 确保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>