“Cross origin requests are only supported for HTTP.” error when loading a local file
I’m trying to load a 3D model into Three.js with JSONLoader, and that 3D model is in the same directory as the entire website.
I’m getting the “Cross origin requests are only supported for HTTP.” error, but I don’t know what’s causing it nor how to fix it.
Solutions/Answers:
Solution 1:
My crystal ball says that you are loading the model using either file://
or C:/
, which stays true to the error message as they are not http://
So you can either install a webserver in your local PC or upload the model somewhere else and use jsonp
and change the url to http://example.com/path/to/model
Origin is defined in RFC-6454 as
...they have the same
scheme, host, and port. (See Section 4 for full details.)
So even though your file originates from the same host (localhost
), but as long as the scheme is different (http
/ file
), they are treated as different origin.
Solution 2:
Just to be explicit – Yes, the error is saying you cannot point your browser directly at file://some/path/some.html
Here are some options to quickly spin up a local web server to let your browser render local files
Python 2
If you have Python installed…
-
Change directory into the folder where your file
some.html
or file(s) exist using the commandcd /path/to/your/folder
-
Start up a Python web server using the command
python -m SimpleHTTPServer
This will start a web server to host your entire directory listing at http://localhost:8000
- You can use a custom port
python -m SimpleHTTPServer 9000
giving you link:http://localhost:9000
This approach is built in to any Python installation.
Python 3
Do the same steps, but use the following command instead python3 -m http.server
Node.js
Alternatively, if you demand a more responsive setup and already use nodejs…
-
Install
http-server
by typingnpm install -g http-server
-
Change into your working directory, where your
some.html
lives -
Start your http server by issuing
http-server -c-1
This spins up a Node.js httpd which serves the files in your directory as static files accessible from http://localhost:8080
Ruby
If your preferred language is Ruby … the Ruby Gods say this works as well:
ruby -run -e httpd . -p 8080
PHP
Of course PHP also has its solution.
php -S localhost:8000
Solution 3:
Solution 4:
Ran in to this today.
I wrote some code that looked like this:
app.controller('ctrlr', function($scope, $http){
$http.get('localhost:3000').success(function(data) {
$scope.stuff = data;
});
});
…but it should’ve looked like this:
app.controller('ctrlr', function($scope, $http){
$http.get('http://localhost:3000').success(function(data) {
$scope.stuff = data;
});
});
The only difference was the lack of http://
in the second snippet of code.
Just wanted to put that out there in case there are others with a similar issue.
Solution 5:
Just change the url to http://localhost
instead of localhost
. If you open the html file from local, you should create a local server to serve that html file, the simplest way is using Web Server for Chrome
. That will fix the issue.
Solution 6:
In an Android app — for example, to allow JavaScript to have access to assets via file:///android_asset/
— use setAllowFileAccessFromFileURLs(true)
on the WebSettings
that you get from calling getSettings()
on the WebView
.