javascript - resource - Solicitud Ajax rechazada debido a Origin ''null'', el origen ES el mismo y NO en localhost o archivo local
no access control allow origin header is present on the requested resource xmlhttprequest (2)
¿su http://www.example.com/sitemap.xml
está en un dominio diferente al dominio en el que se encuentra su script? En caso afirmativo, el navegador bloqueará la solicitud por razones de seguridad. Es posible que desee ver cómo usar CORS
Las páginas web normales pueden usar el objeto XMLHttpRequest para enviar y recibir datos desde servidores remotos, pero están limitadas por la misma política de origen. Las extensiones no son tan limitadas. Una extensión puede comunicarse con servidores remotos fuera de su origen, siempre que primero solicite permisos de origen cruzado.
Puede leer más sobre la misma política de origen aquí
SOLUCIONADO ?, casi ..
Esto está relacionado con la forma en que Chrome (47.0.2526.73) maneja archivos xml. No sé los detalles, pero este código funciona perfectamente bien en Firefox (43.0.4).
Todavía tengo curiosidad sobre por qué esto es así o cómo hacer que funcione en Chrome.
Lo que intento hacer
Cree un bookmarklet de javascript para verificar los enlaces xml del sitemap para 404s / 500s / etc.
Fragmento de código en cuestión:
var siteMap="http://www.example.com/sitemap.xml";
var httpPoke = function(url,callback){
var x;
x = new XMLHttpRequest();
x.open(''HEAD'', url);
x.onreadystatechange = function() {
if (this.readyState == this.DONE) {
callback(this.status);
}
}
x.send();
};
var response=httpPoke(siteMap,function(n){
console.log(n);
});
Si estoy en cualquier otra página del dominio, la respuesta es:
200
Si navego al mapa del sitio real, http://www.example.com/sitemap.xml , el mismo código responde con:
Ningún encabezado ''Access-Control-Allow-Origin'' está presente en el recurso solicitado. Por lo tanto, el origen ''nulo'' no está permitido.
Dado que mi objetivo es proporcionar un bookmarklet que se pueda invocar en el propio sitemap, esto pone un problema en mi plan.
Cómo probar esto:
1) Encuentra cualquier xml de algún sitio web. Google "filetype: xml sitemap" y busque una respuesta que sea solo un archivo xml (encontrará que algunos lo redireccionarán).
2) Coloque el código anterior en un bookmarklet, o directamente en la consola del desarrollador de su navegador.
3) Asegúrese de que la variable siteMap esté configurada en la URL actual. Esto es para cumplir con CORS. Incluso podría hacer siteMap = location.href;
Lo que encontrarás es que funciona bien en Firefox, pero no en Chrome.
Nota:
Ejecutar código desde una página HTML, dirigir una página HTML funciona .
Ejecutar código desde una página HTML, la orientación a una página XML funciona .
Ejecutar código desde una página XML, dirigir una página HTML no funciona .
Ejecutar código desde una página XML, dirigir una página XML no funciona .
Investigación que he hecho:
Todo lo que puedo encontrar sobre este error está (comprensiblemente) relacionado con:
- Solicitudes de dominios cruzados
- Tener el origen o destino en localhost, file: ///, o de lo contrario en su máquina local.
Mi escenario no es ninguno de estos.
DE ACUERDO.
Antes, dije:
Entonces, cuando ve un archivo xml con Firefox o Chrome (o IE, presumiblemente), lo que está viendo es en realidad un documento creado por el analizador xml incorporado del navegador .
En el caso de Chrome, se sirve desde (nodomain) y se identifica así:
/* Copyright 2014 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */
Entonces, aunque la URL dice " http://www.example.com/sitemap.xml ", y en la ventana de la consola.location.href es " http://www.example.com/sitemap.xml ", y la ubicación .origin es "" http://www.example.com ", en realidad, el origen es (nodomain) como si fuera una página de extensión. Porque lo es.
Por lo tanto, el origen es siempre nulo para las páginas xml.
Este no es necesariamente el caso.
Encontré esto:
Chrome agrega el encabezado Origen a la solicitud del mismo origen
Las pruebas en Firefox confirman que FF no establece Origen en las solicitudes GET o HEAD de origen idéntico, pero Chrome sí lo hace. Normalmente, esto no es un problema, pero en las páginas XML document.domain se establece en null. Por lo tanto, el origen que establece es nulo.
Posiblemente un error en Chrome? ¿O intencional?
Todavía no estoy satisfecho con mi propia respuesta ...
Prueba esto :
- Ve a cualquier página xml en Chrome.
- En la consola, realice cualquier solicitud de AJAX.
Compruebe los encabezados de solicitud en la pestaña de red:
Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 Cache-Control:no-cache Connection:keep-alive Host:www.example.com Origin:null Pragma:no-cache User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
Ve arriba, jaromanda-x por su intuición que me llevó a las respuestas.