Apache y Nodejs entre dominio ajax problema

Estoy trabajando en una aplicación en la que he usado dos servidores alojados en la misma máquina, uno es apache, que funcionará como un host básico para servir páginas php y otro nodo lateral para la comunicación del rest de aplicaciones, toda la aplicación se basa en la red troncal / marionette / requirejs / oreja.

Llegando al punto, mis páginas normales se cargan desde un servidor apache como,

http://192.168.20.62/project/design.php 

y he configurado mi modelo como este,

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

cuando trato de guardar el modelo, estoy sufriendo el problema de una llamada cruzada de dominio ajax y terminé con un error en mi comunicación de guardar, a continuación se encuentra el servidor de nodo / expreso,

 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); 

Como puede ver, ya escribí un parche en el código del servidor, pero igual, también he agregado .htaccess en el nivel raíz de ambos en

 http://192.168.20.62 

y

 http://192.168.20.62:9847 

con el siguiente código,

 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" 

pero las cosas no están ayudando de todos modos, si ejecuto chrome al deshabilitar la seguridad web, entonces las cosas funcionan correctamente.

chrome.exe –disable-web-security

¿Pueden por favor ayudarme a resolver este rompecabezas, gracias de antemano?

A continuación se muestra el mensaje de error de la consola javascript de Chrome.

 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. 

Vaya, me he dado cuenta del problema, he configurado la url incorrecta para la lista blanca.

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

Tengo que incluir en la lista blanca la URL de origen que generaba el dominio cruzado, este fue el único cambio que se debe hacer para que se ejecute.

También esto tiene un impacto en la versión del navegador, cuando publiqué este problema, estaba comprobando con la versión 24.0. * De Firefox y cuando actualicé la versión 25.0, dejó de generar un error de dominio cruzado de manera sorprendente. Pero aún así, Chrome da un error de dominio cruzado natural, cuando leo el mensaje de error de Chrome con cuidado llego a saber que he incluido en la lista blanca la URL incorrecta.

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.

Si no tiene que lidiar con WebSockets, coloque Node.js detrás de Apache a través de mod_proxy :

 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 

En su página web puede acceder a su API con el mismo puerto que su Apache y no tiene ningún problema con Cross-Domain / Same-Origin-Policy.

Solo tiene que separar sus URI ahora, por ejemplo, / page / existe solo en la aplicación node.js.

Si solo está sirviendo REST (no HTML / CSS / Imágenes) a través de node.js, usar JSONP sería otra opción. Aquí hay una buena + breve descripción de cómo manejar JSONP en Express