Permitir que Google Chrome use XMLHttpRequest para cargar una URL desde un archivo local

125

Al intentar hacer una solicitud HTTP usando XMLHttpRequest desde un archivo local, básicamente falla debido a una Access-Control-Allow-Originviolación.

Sin embargo, estoy usando la página web local, así que me preguntaba si hay alguna forma de hacer que Google Chrome permita estas solicitudes, que van desde un archivo local a una URL en Internet.

Por ejemplo, $.get('http://www.google.com/')falla cuando se ejecuta en un archivo local, pero yo mismo he escrito la página y la estoy usando, por lo que sería extremadamente útil si pudiera suprimirla y cargar la URL.

Entonces, ¿cómo puedo permitir que Google Chrome cargue URL usando XMLHttpRequest de archivos locales?

pimvdb
fuente
1
Access-Control-Allow-Origin: nullpor el sitio web funciona. (ofc. not by google.com)
inf3rno
3
@JessamynSmith: el orden de las respuestas cambia, y la respuesta aceptada también puede cambiar, por lo que es mejor vincular a una respuesta que decir algo como 'la respuesta debajo de la respuesta aceptada'. Utilice la URL a la que conduce el enlace "compartir" de la respuesta.
Michael Scheper
2
@MichaelScheper Su comentario es algo irrelevante dado que pegué el comando real que funcionó. Sin embargo, en caso de que haya un valor al incluir el enlace, lo eliminé y volví a publicar. En Chrome moderno, los errores se ven así: XMLHttpRequest no puede cargar el archivo: ///path/to/file/css/base.css. Las solicitudes de origen cruzado solo se admiten para esquemas de protocolo: http, data, chrome, chrome-extension, https, chrome-extension-resource. Esta respuesta stackoverflow.com/a/4819114/1649165 funcionó para mí, es decir, ejecute Chrome desde la línea de comando: Chrome --allow-file-access-from-files
Jessamyn Smith
@JessamynSmith: Lo siento, pensaste que mi consejo era irrelevante. Como pensabas que una respuesta en particular era relevante, pensé que te gustaría probar tu comentario en el futuro. Mi error.
Michael Scheper

Respuestas:

49

Chrome de inicio con --disable-web-security

En Windows:

chrome.exe --disable-web-security

En Mac:

open /Applications/Google\ Chrome.app/ --args --disable-web-security

Esto permitirá solicitudes de dominio cruzado.
No sé si esto también funciona para archivos locales, ¡pero avísanos!

Y mencione, esto hace exactamente lo que espera, deshabilita la seguridad web, así que tenga cuidado con eso.

jAndy
fuente
También puedes usar Safari en una Mac. Permite a AJAX a los archivos locales de forma predeterminada cuando la solicitud se realiza desde un archivo local. Además, sobre '.exe', nada en la Q se dice sobre Windows. Pim es un desarrollador de Windows, pero aún así, nada se dice sobre Windows.
1
Sí, estoy en Windows, perdón por eso. Probaré esto ahora, gracias. Por cierto, siempre estoy ejecutando Chrome cuando mi computadora está encendida, entonces, ¿hay alguna manera de permitir solo solicitudes de dominio cruzado con archivos locales o solo en una pestaña específica? Porque de esta manera, en realidad no puedo navegar por Internet de forma segura al mismo tiempo ...
pimvdb
1
Acabo de descargar la última versión de Chromium para tener una versión independiente e insegura ejecutándose para las pruebas, y el Chrome 'real' instalado para una navegación segura en Internet. Y funciona, gracias!
pimvdb
@Tom: deberías poder hacer esto en Mac con Safari, sin ningún cambio de configuración, siempre que uses el protocolo "file: ///" y no " localhost "
Near Privman
2
Lo probé en Safari 10.1 y me dio: XMLHttpRequest cannot load file:///<my_local_file>. Cross origin requests are only supported for HTTP.así que la declaración sobre el navegador Safari de este hilo ya no es válida.
Michal Cichon
233

¡Usar el --disable-web-securityinterruptor es bastante peligroso ! ¿Por qué deshabilitar la seguridad mientras puede permitir que XMLHttpRequest acceda a archivos de otros archivos mediante el --allow-file-access-from-filesinterruptor?

Antes de usar estos comandos, asegúrese de finalizar todas las instancias en ejecución de Chrome.

En Windows:

chrome.exe --allow-file-access-from-files

En Mac:

open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files

Discusiones de esta "característica" de Chrome:

Konstantin Smolyanin
fuente
55
¿Es posible hacer que este sea el comportamiento predeterminado sin tener que abrir una terminal / línea de comando o un acceso directo personalizado cada vez?
Kokodoko
1
@Kokodoko, creo que no.
Konstantin Smolyanin
2
@JoshH Estoy completamente de acuerdo en que es mucho mejor usar el servidor web local para el desarrollo del sitio web que acceder a los archivos locales directamente desde el navegador. Sin embargo, se hizo la pregunta exacta y acabo de responderla.
Konstantin Smolyanin
13
En caso de que alguien más intente esto: esta bandera no está disponible / modificable enchrome://flags
Blaise
55
@pimvdb Creo que deberías marcar esta como la respuesta aceptada.
chris-l
21

Versión para Mac. Desde la terminal ejecutada:

open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files
Nek
fuente
Veo varios votos negativos aquí. ¿Puedes explicar qué hay de malo en mi respuesta?
Nek
Como explican otras respuestas, no es aconsejable sugerir deshabilitar toda la seguridad web cuando hay un interruptor específico que cambia esta única cosa.
curiousdannii
Sería bueno tener una solución más permanente. Este supone que el usuario lo sabe de antemano y también requiere un relanzamiento de Chrome.
Michael Dunn
3

En Ubuntu:

chromium-browser --disable-web-security

Para más detalles / interruptores:

http://peter.sh/experiments/chromium-command-line-switches/

Referenciado desde

Taimoor Changaiz
fuente
Creo que especificar archivos será más seguro `google-chrome --allow-file-access-from-files ~ / foo`
Muhammed Moussa
Esto es un poco amplio para el caso de uso específico. Pero los accesorios para una solución independientemente
Michael Dunn