Reputation: 32314
I'm trying to load a 3D model, stored locally on my computer, 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.
Upvotes: 1062
Views: 1756090
Reputation: 14937
Update: I personally turn off security.fileuri.strict_origin_policy
in Firefox via about:config
. It allows fetch
to work in my local html files so I can test my work without having to start a server. Unlike Chrome, Firefox doesn't need to be restarted to change this policy. I have no clue how this may impact normal browsing; I assume it only affects local .HTML files you open. But Firefox is not my primary browser anyway, so I just leave it on.
For those on Windows without Python or Node.js, there is still a lightweight solution: Mongoose.
All you do is drag the executable to wherever the root of the server should be, and run it. An icon will appear in the taskbar and it'll navigate to the server in the default browser.
Also, Z-WAMP is a 100% portable WAMP that runs in a single folder, it's awesome. That's an option if you need a quick PHP and MySQL server. Though it hasn't been updated since 2013. A modern alternative would be Laragon or WinNMP. I haven't tested them, but they are portable and worth mentioning. I also was a fan of Uniform Server years ago; but it seems a bit dated, yet still around.
Also, if you only want the absolute basics (HTML+JS), here's a tiny PowerShell script that doesn't need anything to be installed or downloaded:
$Srv = New-Object Net.HttpListener;
$Srv.Prefixes.Add("http://localhost:8080/");
$Srv.Start();
Start-Process "http://localhost:8080/index.html";
While($Srv.IsListening) {
$Ctx = $Srv.GetContext();
$Buf = [System.IO.File]::OpenRead((Join-Path $Pwd($Ctx.Request.RawUrl)));
$Ctx.Response.ContentLength64 = $Buf.Length;
$Ctx.Response.Headers.Add("Content-Type", "text/html");
$Buf.CopyTo($Ctx.Response.OutputStream);
$Buf.Close();
$Ctx.Response.Close();
};
This method is very barebones, it cannot show directories or other fancy stuff. But it handles these CORS errors just fine.
Save the script as server.ps1
and run in the root of your project. It will launch index.html in the directory it is placed in.
Upvotes: 13
Reputation: 28265
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
If you have Python installed...
Change directory into the folder where your file some.html
or file(s) exists using the command cd /path/to/your/folder
Start up a Python web server using one of below commands
python -m SimpleHTTPServer # python 2
python3 -m http.server # python 3
This will start a web server to host your entire directory listing at http://localhost:8000
python3 -m http.server 9000
giving you link: http://localhost:9000 to point your browser atThis approach is built in to any Python installation.
If you are using Visual Studio Code you can install the Live Server extension which provides a local web server ... after installing this extension click on Go Live
widget on bottom of vscode window to launch browser pointing at your code dir
Alternatively, if you demand a more responsive setup and already use nodejs...
Install http-server
by typing npm install -g http-server
Change into your working directory, where yoursome.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
If your preferred language is Ruby ... the Ruby Gods say this works as well:
ruby -run -e httpd . -p 8080
Of course PHP also has its solution.
php -S localhost:8000
Upvotes: 816
Reputation:
In Chrome you can use this flag:
--allow-file-access-from-files
Read more here: How to launch html using Chrome at "--allow-file-access-from-files" mode?
Upvotes: 201
Reputation: 809
If you use old version of Mozilla Firefox (pre-2019), it will work as expected without any issues;
P.S. Surprisingly, old versions of Internet Explorer & Edge work absolutely fine too.
Upvotes: 13
Reputation: 5851
url should be like:
createUserURL = "http://www.localhost:3000/api/angular/users"
instead of:
createUserURL = "localhost:3000/api/angular/users"
Upvotes: 0
Reputation: 69
If your using VS code just trying loading a live server in there. fixed my problem immediately.
Upvotes: 0
Reputation: 6817
If you are searching for a solution for Firebase Hosting, you can run the
firebase serve --only hosting
command from the Firebase CLI
That's what I came here for, so I thought I'd just leave it here to help like ones.
Upvotes: 0
Reputation: 10604
I'm going to list 3 different approaches to solve this issue:
npm
package: Install live-server using npm install -g live-server
. Then, go to that directory open the terminal and type live-server
and hit enter, page will be served at localhost:8080
. BONUS: It also supports hot reloading by default.target
to "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession"
and save. Then using Chrome open the page using ctrl+o
. NOTE: Do NOT use this shortcut for regular browsing.Note: Use http://
like http://localhost:8080
in case you face error.
Upvotes: 37
Reputation: 3094
If you insist on running the .html
file locally and not serving it with a webserver, you can prevent those cross origin requests from happening in the first place by making the problematic resources available inline.
I had this problem when trying to to serve .js
files through file://
. My solution was to update my build script to replace <script src="...">
tags with <script>...</script>
.
Here's a gulp
approach for doing that:
1.
run npm install --save-dev
to packages gulp
, gulp-inline
and del
.
2.
After creating a gulpfile.js
to the root directory, add the following code (just change the file paths for whatever suits you):
let gulp = require('gulp');
let inline = require('gulp-inline');
let del = require('del');
gulp.task('inline', function (done) {
gulp.src('dist/index.html')
.pipe(inline({
base: 'dist/',
disabledTypes: 'css, svg, img'
}))
.pipe(gulp.dest('dist/').on('finish', function(){
done()
}));
});
gulp.task('clean', function (done) {
del(['dist/*.js'])
done()
});
gulp.task('bundle-for-local', gulp.series('inline', 'clean'))
gulp bundle-for-local
or update your build script to run it automatically.You can see the detailed problem and solution for my case here.
Upvotes: 3
Reputation: 2702
For Linux Python users:
import webbrowser
browser = webbrowser.get('google-chrome --allow-file-access-from-files %s')
browser.open(url)
Upvotes: 1
Reputation: 2716
Experienced this when I downloaded a page for offline view.
I just had to remove the integrity="*****"
and crossorigin="anonymous"
attributes from all <link>
and <script>
tags
Upvotes: 3
Reputation: 875
cordova achieve this. I still can not figure out how cordova did. It does not even go through shouldInterceptRequest.
Later I found out that the key to load any file from local is: myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
And when you want to access any http resource, the webview will do checking with OPTIONS method, which you can grant the access through WebViewClient.shouldInterceptRequest by return a response, and for the following GET/POST method, you can just return null.
Upvotes: 0
Reputation: 2159
Easy solution for whom using VS Code
I've been getting this error for a while. Most of the answers works. But I found a different solution. If you don't want to deal with node.js
or any other solution in here and you are working with an HTML file (calling functions from another js file or fetch json api's) try to use Live Server extension.
It allows you to open a live server easily. And because of it creates localhost
server, the problem is resolving. You can simply start the localhost
by open a HTML file and right-click on the editor and click on Open with Live Server
.
It basically load the files using http://localhost/index.html
instead of using file://...
.
EDIT
It is not necessary to have a .html
file. You can start the Live Server with shortcuts.
Hit
(alt+L, alt+O)
to Open the Server and(alt+L, alt+C)
to Stop the server. [On MAC,cmd+L, cmd+O
andcmd+L, cmd+C
]
Hope it will help someone :)
Upvotes: 14
Reputation: 60496
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.
Upvotes: 952
Reputation: 20080
Use http://
or https://
to create url
error: localhost:8080
solution: http://localhost:8080
Upvotes: 24
Reputation: 3943
fastest way for me was:
for windows users run your file on Firefox problem solved, or
if you want to use chrome easiest way for me was to install Python 3 then from command prompt run command python -m http.server
then go to http://localhost:8000/ then navigate to your files
python -m http.server
Upvotes: 19
Reputation: 5213
I suspect it's already mentioned in some of the answers, but I'll slightly modify this to have complete working answer (easier to find and use).
Go to: https://nodejs.org/en/download/. Install nodejs.
Install http-server by running command from command prompt npm install -g http-server
.
Change into your working directory, where index.html
/yoursome.html
resides.
Start your http server by running command http-server -c-1
Open web browser to http://localhost:8080
or http://localhost:8080/yoursome.html
- depending on your html filename.
Upvotes: 9
Reputation: 601
Not possible to load static local files(eg:svg) without server. If you have NPM /YARN installed in your machine, you can setup simple http server using "http-server"
npm install http-server -g
http-server [path] [options]
Or open terminal in that project folder and type "hs". It will automaticaly start HTTP live server.
Upvotes: 3
Reputation: 454
I have also been able to recreate this error message when using an anchor tag with the following href:
<a href="javascript:">Example a tag</a>
In my case an a tag was being used to get the 'Pointer Cursor' and the event was actually controlled by some jQuery on click event. I removed the href and added a class that applies:
cursor:pointer;
Upvotes: 0
Reputation: 2484
Start the app server,and you should be able to access the file from localhost
Upvotes: 1
Reputation: 4050
I suggest you use a mini-server to run these kind of applications on localhost (if you are not using some inbuilt server).
Here's one that is very simple to setup and run:
https://www.npmjs.com/package/tiny-server
Upvotes: 3
Reputation: 2775
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.
Upvotes: 51
Reputation: 1006494
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
.
Upvotes: 23
Reputation: 4042
It simply says that the application should be run on a web server. I had the same problem with chrome, I started tomcat and moved my application there, and it worked.
Upvotes: 3
Reputation: 71
Many problem for this, with my problem is missing '/' example: jquery-1.10.2.js:8720 XMLHttpRequest cannot load http://localhost:xxxProduct/getList_tagLabels/ It's must be: http://localhost:xxx/Product/getList_tagLabels/
I hope this help for who meet this problem.
Upvotes: 0
Reputation: 16463
For all y'all on MacOS
... setup a simple LaunchAgent to enable these glamorous capabilities in your own copy of Chrome...
Save a plist
, named whatever (launch.chrome.dev.mode.plist
, for example) in ~/Library/LaunchAgents
with similar content to...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>launch.chrome.dev.mode</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Google Chrome.app/Contents/MacOS/Google Chrome</string>
<string>-allow-file-access-from-files</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
It should launch at startup.. but you can force it to do so at any time with the terminal command
launchctl load -w ~/Library/LaunchAgents/launch.chrome.dev.mode.plist
TADA! 😎 💁🏻 🙊 🙏🏾
Upvotes: 2
Reputation: 10975
One way it worked loading local files is using them with in the project folder instead of outside your project folder. Create one folder under your project example files similar to the way we create for images and replace the section where using complete local path other than project path and use relative url of file under project folder . It worked for me
Upvotes: 1
Reputation: 513
er. I just found some official words "Attempting to load unbuilt, remote AMD modules that use the dojo/text plugin will fail due to cross-origin security restrictions. (Built versions of AMD modules are unaffected because the calls to dojo/text are eliminated by the build system.)" https://dojotoolkit.org/documentation/tutorials/1.10/cdn/
Upvotes: 1
Reputation: 2888
I was getting this exact error when loading an HTML file on the browser that was using a json file from the local directory. In my case, I was able to solve this by creating a simple node server that allowed to server static content. I left the code for this at this other answer.
Upvotes: 5
Reputation: 3216
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.
Upvotes: 74