微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache和Nodejs跨域ajax问题

我正在使用两台服务器托pipe在同一台机器上的应用程序,一个是apache,它将作为基本主机为服务PHP页面和其他端点nodejs的其他api通信,整个应用程序build立在主干/牵线木偶/ requirejs /引导。

来到这一点,我的正常页面是从Apache服务器加载,

http://192.168.20.62/project/design.PHP

我已经configuration好了我的模型

define(['backbone'],function(Backbone){ 'use strict'; return Backbone.Model.extend({ url:"http://192.168.20.62:9847/page",defaults: { ... } }); });

当我尝试保存模型时,我正在遭受ajax跨域调用的问题,并且在保存的通信中结束了错误,以下是节点/快速服务器,

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

http://192.168.20.62:9847

用下面的代码

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,DELETE,OPTIONS"

但事情并没有帮助反正,如果我运行铬禁用networking安全,那么事情正常工作。

chrome.exe – 禁用networking安全

你们可以请帮我解决这个难题,在此先感谢。

以下是来自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.

哎呀我找出问题,我已经安装了错误的网址为白色上市。

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

我必须将产生跨域的源URL列入白名单,这是唯一必须做的事情来使事情运行。

这也有浏览器版本的影响,当我发布这个问题时,我正在检查与火狐版本24.0。*,当我升级25.0它已经停止产生跨域错误令人惊讶。 但仍然铬给自然跨域错误,当我仔细阅读铬的错误信息,我来知道,我已经列入了错误的网址白名单。

XMLHttpRequest cannot load http://192.168.20.62:9847/page. The 'Access-Control-Allow-Origin' whitelists only 'http://192.168.20.62:9847'. Origin 'http://192.168.20.62' is not in the list,and is therefore not allowed access.

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

Loadmodulee proxy_module modules/mod_proxy.so Loadmodulee proxy_http_module modules/mod_proxy_http.so Loadmodulee 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 /图像),则使用JSONP将是另一种选择。 这里是一个很好的+简短的描述如何处理Express中的JSONP

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐