Apache和Nodejs跨域ajax问题

Apache和Nodejs跨域ajax问题,ajax,node.js,apache,cross-domain,marionette,Ajax,Node.js,Apache,Cross Domain,Marionette,我正在开发一个应用程序,在这个应用程序中,我使用了两台托管在同一台机器上的服务器,一台是apache,它将作为服务php页面的基本主机,另一台是用于RESTAPI通信的侧节点,整个应用程序构建在主干/木偶/requirejs/bootstrap上 说到这里,我的普通页面是从apache服务器加载的,比如 http://192.168.20.62/project/design.php 我已经这样配置了我的模型 define(['backbone'],function(Backbone){ 'us

我正在开发一个应用程序,在这个应用程序中,我使用了两台托管在同一台机器上的服务器,一台是apache,它将作为服务php页面的基本主机,另一台是用于RESTAPI通信的侧节点,整个应用程序构建在主干/木偶/requirejs/bootstrap上

说到这里,我的普通页面是从apache服务器加载的,比如

http://192.168.20.62/project/design.php
我已经这样配置了我的模型

define(['backbone'],function(Backbone){
'use strict';

return Backbone.Model.extend({
    url:"http://192.168.20.62:9847/page",
    defaults: {
        ...
    }
});

});
当我试图保存模型时,我遇到了ajax跨域调用的问题,最终在保存通信中出错,下面是node/express服务器

var express = require('/root/node_modules/express');


var app = express();

app.configure(function () {
    app.use(express.json());
    app.use(express.urlencoded());
    app.use(function (req, res, next) {
        res.setHeader('Access-Control-Allow-Origin', 'http://192.168.20.62:9847');
        res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
        res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
        res.setHeader('Access-Control-Allow-Credentials', true);
        next();
    });

})

app.post('/page', function(request, response){

    console.log(request.body);
    response.send(request.body);

});

app.listen(9847);
正如您所看到的,我已经在服务器代码中编写了一些修补程序,但仍然是一样的,我还添加了.htaccess,它位于

http://192.168.20.62 

使用以下代码

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
但无论如何,事情并没有起到任何作用,若我通过禁用网络安全来运行chrome,那个么事情就正常工作了

chrome.exe--禁用web安全

你们能帮我解决这个难题吗,提前谢谢

以下是来自chrome javascript控制台的错误消息

OPTIONS http://192.168.20.62:9847/page Origin http://192.168.20.62 is not allowed by Access-Control-Allow-Origin. jquery-2.0.3.min.js:6

XMLHttpRequest cannot load http://192.168.20.62:9847/page. Origin http://192.168.20.62 is not allowed by Access-Control-Allow-Origin. 

如果您不必处理WebSocket,那么通过mod_proxy将Node.js放在Apache后面:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

# disable use as forward proxy
ProxyRequests Off
# don't handle Via: headers - we don't care about them
ProxyVia Off
# no need to transport host name - not doing virtual hosting
ProxyPreserveHost Off

ProxyPass         /page/   http://192.168.20.62:9847/page/
ProxyPassReverse  /page/   http://192.168.20.62:9847/page/

# If you get HTTP status code 502 (Bad Gateway), maybe this could help
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
在网页中,您可以使用与Apache相同的端口访问API,并且跨域/同源策略没有任何问题

您现在只需分离URI,例如/page/仅存在于node.js应用程序中


如果您通过node.js仅提供REST(无HTML/CSS/Images),那么使用JSONP将是另一种选择。下面是一个好的+简短的描述

哎呀,我发现了问题,我为白名单设置了错误的url

res.setHeader('Access-Control-Allow-Origin','http://192.168.20.62');

我必须将生成跨域的源URL列为白名单,这是唯一要做的更改,以使其运行

这也会对浏览器版本产生影响,当我发布此问题时,我正在检查firefox版本24.0。*当我升级25.0时,它意外地停止生成跨域错误。但Chrome仍然会出现自然的跨域错误,当我仔细阅读Chrome的错误消息时,我才知道我把错误的url列入了白名单


XMLHttpRequest无法加载http://192.168.20.62:9847/page. “访问控制仅允许源站”白名单http://192.168.20.62:9847'. 起源'http://192.168.20.62'不在列表中,因此不允许访问。

谢谢,伙计,JSONP真的很有效,一个简单的问题是,现在在express/node中处理JSOP的最佳方法是什么,我的意思是现在如何解析JSONP对象?请参阅编辑。也许你应该考虑使用MODEXPROVER解决方案。如果您有时希望使用HTTPS为您的页面/应用程序提供服务,您只需要一个IP地址。如果您想对节点进行负载平衡请求,可以使用Apache模块来实现。你减少了开放端口的数量。嗯,听起来很合理,我一定会试试看。再次感谢,非常感谢
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so

# disable use as forward proxy
ProxyRequests Off
# don't handle Via: headers - we don't care about them
ProxyVia Off
# no need to transport host name - not doing virtual hosting
ProxyPreserveHost Off

ProxyPass         /page/   http://192.168.20.62:9847/page/
ProxyPassReverse  /page/   http://192.168.20.62:9847/page/

# If you get HTTP status code 502 (Bad Gateway), maybe this could help
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1