How to solve 'Redirect has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header'?

JavascriptJqueryVuejs2

Javascript Problem Overview


I am working on an app using Vue js. According to my setting I need to pass to a variable to my URL when setting change.

<!-- language: lang-js -->

    $.get('http://172.16.1.157:8002/firstcolumn/' + c1v + '/' + c1b, function (data) { 
      // some code...
    });

But when my app hit on URL, it shows the following message.

Failed to load http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26: Redirect from 'http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26' to 'http://172.16.1.157:8002/firstcolumn/2017-03-01/2017-10-26/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.

Javascript Solutions


Solution 1 - Javascript

In addition to what awd mentioned about getting the person responsible for the server to reconfigure (an impractical solution for local development) I use a change-origin chrome plugin like this:

Moesif Orign & CORS Changer

You can make your local dev server (ex: localhost:8080) to appear to be coming from 172.16.1.157:8002 or any other domain.

Solution 2 - Javascript

Thanks all, I solved by this extension on chrome.

Allow CORS: Access-Control-Allow-Origin

Solution 3 - Javascript

If you have control over your server, you can use PHP:

<?PHP
header('Access-Control-Allow-Origin: *');
?>

Solution 4 - Javascript

Ask the person maintaining the server at http://172.16.1.157:8002/ to add your hostname to Access-Control-Allow-Origin hosts, the server should return a header similar to the following with the response-

Access-Control-Allow-Origin: yourhostname:port

Solution 5 - Javascript

When you have this problem with Chrome, you don't need an Extension.
Start Chrome from the Console:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

Maybe you have to close all Tabs in Chrome and restart it.

Solution 6 - Javascript

Using npm:

To allow cross-origin requests install 'cors':

npm i cors

Add this in the server-side:

let cors = require("cors");
app.use(cors());

Solution 7 - Javascript

Hello If I understood it right you are doing an XMLHttpRequest to a different domain than your page is on. So the browser is blocking it as it usually allows a request in the same origin for security reasons. You need to do something different when you want to do a cross-domain request. A tutorial about how to achieve that is Using CORS.

When you are using postman they are not restricted by this policy. Quoted from Cross-Origin XMLHttpRequest:

Regular web pages can use the XMLHttpRequest object to send and receive data from remote servers, but they're limited by the same origin policy. Extensions aren't so limited. An extension can talk to remote servers outside of its origin, as long as it first requests cross-origin permissions.

Solution 8 - Javascript

To add the CORS authorization to the header using Apache, simply add the following line inside either the <Directory>, <Location>, <Files> or <VirtualHost> sections of your server config (usually located in a *.conf file, such as httpd.conf or apache.conf), or within a .htaccess file:

>Header set Access-Control-Allow-Origin "*"

And then restart apache.

Altering headers requires the use of mod_headers. Mod_headers is enabled by default in Apache, however, you may want to ensure it's enabled.

Solution 9 - Javascript

I had the same problem in my Vue.js and SpringBoot projects. If somebody work with spring you can add this code:

@Bean
public FilterRegistrationBean simpleCorsFilter() {  
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();  
    CorsConfiguration config = new CorsConfiguration();  
    config.setAllowCredentials(true); 
    // *** URL below needs to match the Vue client URL and port ***
    config.setAllowedOrigins(Collections.singletonList("http://localhost:8080")); 
    config.setAllowedMethods(Collections.singletonList("*"));  
    config.setAllowedHeaders(Collections.singletonList("*"));  
    source.registerCorsConfiguration("/**", config);  
    FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(source));
    bean.setOrder(Ordered.HIGHEST_PRECEDENCE);  
    return bean;  
}   

I found solution in this article Build a Simple CRUD App with Spring Boot and Vue.js

Solution 10 - Javascript

You are making a request to external domain 172.16.1.157:8002/ from your local development server that is why it is giving cross origin exception. Either you have to allow headers Access-Control-Allow-Origin:* in both frontend and backend or alternatively use this extension cors header toggle - chrome extension unless you host backend and frontend on the same domain.

Solution 11 - Javascript

Try running this command in your terminal and then test it again.

curl -H "origin: originHost" -v "RequestedResource"

Eg:

If my originHost equals https://localhost:8081/ and my RequestedResource equals https://example.com/

My command would be as below:

curl -H "origin: https://localhost:8081/" -v "https://example.com/"

If you can notice the following line then it should work for you.

**< access-control-allow-origin: ***

Hope this helps.

Solution 12 - Javascript

The approved answer to this question is not valid.

You need to set headers on your server-side code

app.use((req,res,next)=>{
    res.setHeader('Acces-Control-Allow-Origin','*');
    res.setHeader('Acces-Control-Allow-Methods','GET,POST,PUT,PATCH,DELETE');
    res.setHeader('Acces-Contorl-Allow-Methods','Content-Type','Authorization');
    next(); 
})

Solution 13 - Javascript

You can solve this temporarily by using the Firefox add-on, CORS Everywhere. Just open Firefox, press Ctrl+Shift+A , search the add-on and add it!

Solution 14 - Javascript

Do specify @CrossOrigin(origins = "http://localhost:8081") in Controller class.

Solution 15 - Javascript

You won't believe this, Make sure to add "." at the end of the "url"

I got a similar error with this code:

fetch(https://itunes.apple.com/search?term=jack+johnson)
.then( response => {
    return response.json();
})
.then(data => {
    console.log(data.results);
}).catch(error => console.log('Request failed:', error))

The error I got:

 Access to fetch at 'https://itunes.apple.com/search?term=jack+johnson'
 from origin 'http://127.0.0.1:5500' has been blocked by CORS policy:
 No 'Access-Control-Allow-Origin' header is present on the requested
 resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

But I realized after a lot of research that the problem was that I did not copy the right URL address from the iTunes API documentation.

It should have been

https://itunes.apple.com/search?term=jack+johnson.

not

https://itunes.apple.com/search?term=jack+johnson

> Notice the dot at the end

There is a huge explanation about why the dot is important quoting issues about DNS and character encoding but the truth is you probably do not care. Try adding the dot it might work for you too.

When I added the "." everything worked like a charm.

I hope it works for you too.

Solution 16 - Javascript

you have to customize security for your browser or allow permission through customizing security. (it is impractical for your local testing) to know more about please go through the link.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

Solution 17 - Javascript

install:

npm i cors

Then include cors():

app.get("/list",cors(),(req,res) =>{

});

Solution 18 - Javascript

The reason that I came across this error was that I hadn't updated my the path for different environments.

Solution 19 - Javascript

In addition to the Berke Kaan Cetinkaya's answer.
If you have control over your server, you can do the following in ExpressJs:

app.use(function(req, res, next) {
// update to match the domain you will make the request from
res.header("Access-Control-Allow-Origin", "YOUR-DOMAIN.TLD");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});

https://enable-cors.org/server_expressjs.html

Solution 20 - Javascript

These errors may be caused due to follow reasons, ensure the following steps are followed. To connect the local host with the local virtual machine(host). Here, I'am connecting http://localhost:3001/ to the http://abc.test Steps to be followed:

1.We have to allow CORS, placing Access-Control-Allow-Origin: in header of request may not work. Install a google extension which enables a CORS request.*

2.Make sure the credentials you provide in the request are valid.

3.Make sure the vagrant has been provisioned. Try vagrant up --provision this make the localhost connect to db of the homestead.

  1. Try changing the content type of the header. header:{ 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8;application/json' } this point is very important.

Solution 21 - Javascript

> I will assume that you're a front-end developer only and that you don't have access to the backend of the application (regarding the tags of the question).

Short answer on how to properly solve this in your case? You can't, you'll need somebody else.


What is this about?

You need to understand that CORS is a security thing, it's not just here to annoy you just for fun.
It's purpose is to mainly prevent the usage of a (malicious) HTTP call from a non-whitelisted frontend to your backend with some critical mutation.

You could give a look to this YouTube video or any other one really, but I recommend a visual video because text-based explanation can be quite hard to understand.

You also need to understand that if you use Postman or any other tool to try your API call, you will not get the CORS issue. The reason being that those tools are not Web frontends but rather some server-based tools.

Hence, don't be surprised if something is working there but not in your Vue app, the context is different.


Now, how to solve this?
  1. Depending of the framework used by your backend team, the syntax may be quite different but overall, you'll need to tell them to provide something like Access-Control-Allow-Origin: http://localhost:3000 (or any other port you'll be using).

PS: Using Access-Control-Allow-Origin: * would be quite risky because it would allow anybody to access it, hence why a stricter rule is recommended.

  1. If you're using a service, like an API to send SMS, payment, some Google console or something else really, you'll need to allow your localhost in the dashboard of the service. Ask for credentials to your manager or Tech Lead.
  2. If you have access to the backend, you could it yourself as shown here (ExpressJS in this example): https://flaviocopes.com/cors/

How to hack it in a dirty way?

If you're in a damn hurry and want to get something really dirty, you could use a lot of various hacks a listed in the other answers, here's a quick list:

  • use any extension who is able to create a middleware and forward the request to the backend (it will work because it's not directly coming from your frontend)
  • force your browser to disable CORS, not sure how this would actually solve the issue
  • use a proxy, if you're using Nuxt2, @nuxtjs/proxy is a popular one but any kind of proxy (even a real backend will do the job)
  • any other hack related somehow to the 3 listed above...

At the end, solving the CORS issue can be done quite fast and easily. You only need to communicate with your team or find something on your side (if you have access to the backend/admin dashboard of some service).

I heavily do recommend trying get it right from the beginning because it's related to security and that it may be forgotten down the road...

Solution 22 - Javascript

$.get('https://172.16.1.157:8002/firstcolumn/' + c1v + '/' + c1b, function (data) { 
  // some code...
});

Just put "https" .

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionParkarView Question on Stackoverflow
Solution 1 - JavascriptaltShiftDevView Answer on Stackoverflow
Solution 2 - JavascriptParkarView Answer on Stackoverflow
Solution 3 - JavascriptKardi TeknomoView Answer on Stackoverflow
Solution 4 - JavascriptawdView Answer on Stackoverflow
Solution 5 - JavascriptSJXView Answer on Stackoverflow
Solution 6 - JavascriptAmine ZelView Answer on Stackoverflow
Solution 7 - JavascriptBhavan PatelView Answer on Stackoverflow
Solution 8 - JavascriptPankaj ShindeView Answer on Stackoverflow
Solution 9 - JavascriptmmaView Answer on Stackoverflow
Solution 10 - JavascriptManav MandalView Answer on Stackoverflow
Solution 11 - JavascriptronnjoeView Answer on Stackoverflow
Solution 12 - JavascriptBerke Kaan CetinkayaView Answer on Stackoverflow
Solution 13 - JavascriptPrabhash RathnayakeView Answer on Stackoverflow
Solution 14 - JavascriptAjay TakurView Answer on Stackoverflow
Solution 15 - JavascriptWilliam OrtegaView Answer on Stackoverflow
Solution 16 - JavascriptAditya MView Answer on Stackoverflow
Solution 17 - JavascriptOlu TeaxView Answer on Stackoverflow
Solution 18 - JavascriptTristanisgingerView Answer on Stackoverflow
Solution 19 - JavascriptVlad RyabininView Answer on Stackoverflow
Solution 20 - Javascriptganicvp7View Answer on Stackoverflow
Solution 21 - JavascriptkissuView Answer on Stackoverflow
Solution 22 - JavascriptAmeen FarookView Answer on Stackoverflow