Les demandes d'origine croisée ne sont prises en charge que pour HTTP, mais ce n'est pas entre domaines

88

J'utilise ce code pour faire une requête AJAX:

$("#userBarSignup").click(function(){
    $.get("C:/xampp/htdocs/webname/resources/templates/signup.php",
        {/*params*/},
        function(response){
            $("#signup").html("TEST");
            $("#signup").html(response);
        },
        "html");

Mais de la console JavaScript de Google Chrome, je continue de recevoir cette erreur:

XMLHttpRequest ne peut pas charger le fichier: /// C: /xampp/htdocs/webname/resources/templates/signup.php. Les demandes d'origine croisée ne sont prises en charge que pour HTTP.

Le problème est que le fichier signup.php est hébergé sur mon serveur Web local à partir duquel tout le site Web est exécuté, donc ce n'est pas inter-domaine.

Comment puis-je résoudre ce problème?

siannone
la source
5
Avez-vous essayé d'utiliser une URL HTTP au lieu d'un chemin local?
Edward Thomson
1
Je suggérerais d'utiliser une URL complète
Dominic Green
2
@EdwardThomson Cela a fonctionné! Mais maintenant, je dois définir allow_url_include = Onma configuration de serveur.
siannone

Réponses:

76

Vous devez exécuter un serveur Web et envoyer la requête get à un URI sur ce serveur, plutôt que de faire la requête get à un fichier; par exemple changer la ligne:

    $.get("C:/xampp/htdocs/webname/resources/templates/signup.php",

pour lire quelque chose comme:

    $.get("http://localhost/resources/templates/signup.php",

et la page de demande initiale doit également être créée via http.

Petesh
la source
Cela a fonctionné comme un charme. Maintenant, je dois définir allow_url_include = Onma configuration de serveur. Puis-je l'activer en toute sécurité ou cela causera des problèmes de sécurité?
siannone
Le $ .get est en fait émis dans le contexte javascript du navigateur Web, de sorte que le fichier doit avoir la référence URL - le code qui est écrit en php peut toujours référencer des fichiers locaux sans problème
Petesh
44
Alternativement, il y a la solution Python: (1) naviguez dans une console vers le dossier, (2) entrez python -m SimpleHTTPServer 8888, puis (3) naviguez vers le navigateurhttp://localhost:8888/
geotheory
+1 cela a beaucoup aidé à résoudre mon problème. Merci beaucoup :)
Praveen
5
Remarque pour les utilisateurs de Python 3: utilisezpython -m http.server 8888
Jelle Fresen
113

J'ai eu de la chance en démarrant Chrome avec le commutateur suivant:

--allow-file-access-from-files

Sur os x essayez (retapez les tirets si vous copiez-collez):

open -a 'Google Chrome' --args -allow-file-access-from-files

Sur une autre exécution * nix (non testée)

 google-chrome  --allow-file-access-from-files

ou sous Windows, modifiez les propriétés du raccourci chrome et ajoutez le commutateur, par exemple

 C:\ ... \Application\chrome.exe --allow-file-access-from-files

à la fin du chemin "cible"

prauchfuss
la source
7
Travaux dans Google Chrome (au moins de v24) en principe, mais notez que sur OS X , vous devez l' appeler comme suit: open -a 'Google Chrome' --args —allow-file-access-from-files. Remarque également: si vous spécifiez une URL basée sur un fichier: // (plutôt qu'un chemin de système de fichiers), veillez à utiliser file://localhost/...plutôt que file:///....
mklement0
6
La dernière fois que j'ai essayé de le faire dans Windows, la méthode ci-dessus n'a pas fonctionné. J'ai fini par devoir lancer chrome à partir de l'invite DOS avec le commutateur suivant ... Imparfait mais réalisable.
prauchfuss
Fonctionne très bien sous Linux.
user1205577
Fonctionne correctement sur OS X Yosemite 10.10.2 et Chrome Version 41.0.2272.89 (64 bits).
The Dude
86

Si vous travaillez sur un petit projet frontal et que vous souhaitez le tester localement, vous l'ouvrirez généralement en pointant votre répertoire local dans le navigateur Web, par exemple en entrant file: /// home / erick / mysuperproject / index .html dans votre barre d'URL. Cependant, si votre site essaie de charger des ressources, même si elles sont placées dans votre répertoire local, vous pouvez voir des avertissements comme celui-ci:

XMLHttpRequest ne peut pas charger le fichier: ///home/erick/mysuperproject/mylibrary.js. Les demandes d'origine croisée ne sont prises en charge que pour HTTP.

Chrome et d'autres navigateurs modernes ont mis en œuvre des restrictions de sécurité pour les requêtes Cross Origin, ce qui signifie que vous ne pouvez rien charger via file: ///, vous devez utiliser le protocole http: // à tout moment, même localement en raison des politiques de même origine. Aussi simple que cela, vous auriez besoin de monter un serveur Web pour y exécuter votre projet.

Ce n'est pas la fin du monde et il existe de nombreuses solutions, y compris le bon vieux Apache (avec VirtualHosts si vous exécutez plusieurs autres projets), node.js avec express, un serveur Ruby, etc. ou simplement modifier votre paramètres du navigateur.

Cependant, il existe une solution plus simple et légère pour les paresseux. Vous pouvez utiliser SimpleHTTPServer de Python. Il est déjà fourni avec python, vous n'avez donc pas besoin d'installer ou de configurer quoi que ce soit!

Donc, cd dans le répertoire de votre projet, par exemple

1 cd / home / erick / mysuperproject puis utilisez simplement

1 python -m SimpleHTTPServer Et c'est tout, vous verrez ce message dans votre terminal

1 Servant HTTP sur le port 0.0.0.0 8000 ... Vous pouvez maintenant revenir à votre navigateur et visiter http://0.0.0.0:8000tous vos fichiers de répertoire qui y sont servis. Vous pouvez configurer le port et d'autres choses, il suffit de consulter la documentation. Mais cette astuce fonctionne simplement pour moi lorsque je suis pressé de tester une nouvelle bibliothèque ou de trouver une nouvelle idée.

Et voilà, bon codage!

EDIT: Dans Python 3+, SimpleHTTPServer a été remplacé par http.server. Ainsi, dans Python 3.3, par exemple, la commande suivante est équivalente:

python -m http.server 8000
Pramod Alagambhat
la source
5
La solution paresseuse est géniale. Très simple, vous n'avez rien d'autre à faire.
Nico
équivalent existe aussi dans node.js: simple-http-server
StackHola
Sur Windows 8.1, vous devrez toujours installer Python non?
J86
J'utilise Xampp sur Windows, c'est simple, bien que je recommande d'utiliser node, n'oubliez pas non plus de débloquer le port 80 sur skype pour permettre au serveur de fonctionner
Timo Huovinen
10

J'obtenais la même erreur en essayant de charger simplement des fichiers HTML qui utilisaient des données JSON pour remplir la page, j'ai donc utilisé node.js et express pour résoudre le problème. Si aucun nœud n'est installé, vous devez d'abord installer le nœud .

  1. Installer express npm install express

  2. Créez un fichier server.js dans le dossier racine de votre projet, dans mon cas un dossier au-dessus des fichiers que je voulais serveur

  3. Mettez quelque chose comme ce qui suit dans le fichier server.js et lisez à ce sujet sur le site express gihub:

    var express = require('express');
    var app = express();
    var path = require('path');
    
    // __dirname will use the current path from where you run this file 
    app.use(express.static(__dirname));
    app.use(express.static(path.join(__dirname, '/FOLDERTOHTMLFILESTOSERVER')));
    
    app.listen(8000);
    console.log('Listening on port 8000');
    
  4. Après avoir enregistré server.js, vous pouvez exécuter le serveur en utilisant:

node server.js

  1. Accédez à http://localhost:8000/FILENAMEet vous devriez voir le fichier HTML que vous essayiez de charger
thehme
la source
4

Si nodejs est installé, vous pouvez télécharger et installer le serveur en utilisant la ligne de commande:

npm install -g http-server

Remplacez les répertoires par le répertoire à partir duquel vous souhaitez servir les fichiers:

$ cd ~/projects/angular/current_project 

Exécutez le serveur:

$ http-server 

qui produira le message Démarrage du serveur http, servant sur:

Disponible sur: http: // your_ip: 8080 et http://127.0.0.1:8080

Cela vous permet d'utiliser des URL dans votre navigateur comme

http: // votre_ip: 8080 / index.html

Rahul Reddy
la source
1

Cela fonctionne mieux de cette façon. Assurez-vous que les deux fichiers se trouvent sur le serveur. Lorsque vous appelez la page html, utilisez l'adresse Web comme:, http:://localhost/myhtmlfile.htmlet non C::///users/myhtmlfile.html,. Assurez-vous également que l'url passée au json est une adresse Web comme indiqué ci-dessous:

$(function(){
                $('#typeahead').typeahead({
                    source: function(query, process){
                        $.ajax({
                            url: 'http://localhost:2222/bootstrap/source.php',
                            type: 'POST',
                            data: 'query=' +query,
                            dataType: 'JSON',
                            async: true,
                            success: function(data){
                                process(data);
                            }
                        });
                    }
                });
            });
ken4ward
la source
0
REM kill all existing instance of chrome 
taskkill /F /IM chrome.exe /T
REM directory path where chrome.exe is located
set chromeLocation="C:\Program Files (x86)\Google\Chrome\Application"
cd %chromeLocation%
cd c:
start chrome.exe --allow-file-access-from-files
  1. changez le chemin chromeLocation avec le vôtre.

  2. enregistrer ci-dessus en tant que fichier .bat.

  3. faites glisser et déposez votre fichier sur le fichier de commandes que vous avez créé. (Chrome donne l'option de restauration des pages, donc si vous avez des pages ouvertes, appuyez simplement sur Restaurer et cela fonctionnera)

YJDev
la source
0

Vous pouvez également démarrer un serveur sans python à l'aide de l'interpréteur php.

Par exemple:

cd /your/path/to/website/root
php -S localhost:8000

Cela peut être utile si vous voulez une alternative à npm, car l'utilitaire php est préinstallé sur certains systèmes d'exploitation (y compris Mac).

Pranav Kasetti
la source
0

Pour tous les utilisateurs de python:

Accédez simplement à votre dossier de destination dans le terminal.

cd projectFoder

puis démarrez le serveur HTTP Pour Python3 +:

python -m http.server 8000

Servir HTTP sur :: port 8000 (http: // [::]: 8000 /) ...

allez sur votre lien: http://0.0.0.0:8000/

Prendre plaisir :)

Shiwanshu Kumar
la source