Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Origin http://localhost is not allowed by Access-Control-Allow-Origin.?

Tags:

i have a problem... i try to get json api in "http://api.master18.tiket.com/search/autocomplete/hotel?q=mah&token=90d2fad44172390b11527557e6250e50&secretkey=83e2f0484edbd2ad6fc9888c1e30ea44&output=json"

when i try to offline mode(this means i copy that json API in notepad and call it in my localhost) with this code...

function getLast(){         $.ajax({             url:"http://localhost/tickets/json/api_airport.json",             type:'GET',             dataType:"json",             success:function(data){console.log(data.results.result[1].category);}         });     } 

it runs perfectly.:)

but when i try to real url ("http://api.master18.tiket.com/search/autocomplete/hotel?q=mah&token=90d2fad44172390b11527557e6250e50&secretkey=83e2f0484edbd2ad6fc9888c1e30ea44&output=json") with this code:

$.ajax({             url:"http://api.master18.tiket.com/search/autocomplete/hotel?q=mah&token=90d2fad44172390b11527557e6250e50&secretkey=83e2f0484edbd2ad6fc9888c1e30ea44&output=json",             type:'GET',             crossDomain:true,             beforeSend: function(x) {                 if(x && x.overrideMimeType) {                     x.overrideMimeType("application/j-son;charset=UTF-8");                 }             },             success:function(data){console.log("Success");}         }); 

then in my google chrome javascript console,there is an error like this : "XMLHttpRequest cannot load http://api.master18.tiket.com/search/autocomplete/hotel?q=mah&token=90d2fad44172390b11527557e6250e50&secretkey=83e2f0484edbd2ad6fc9888c1e30ea44&output=json. Origin (http://localhost) is not allowed by Access-Control-Allow-Origin."

i know, it must be cross domain problem, can someone help me? nb:some pieces of code, i got from stack overflow community....thank you :)

like image 960
Gregorius Airlangga Avatar asked Oct 02 '12 01:10

Gregorius Airlangga


People also ask

How do I fix not allowed by Access-Control allow origin?

In that case you can change the security policy in your Google Chrome browser to allow Access-Control-Allow-Origin. This is very simple: Create a Chrome browser shortcut. Right click short cut icon -> Properties -> Shortcut -> Target.

How do I enable CORS on localhost?

1. Use the proxy setting in Create React App. "proxy": "https://cat-fact.herokuapp.com/", Now when you make an API request to https://localhost:3000/api/facts Create React App will proxy the API request to https://cat-fact.herokuapp.com/facts and the CORS error will be resolved.

How do I fix CORS header Access-Control allow Origin missing?

If the server is under your control, add the origin of the requesting site to the set of domains permitted access by adding it to the Access-Control-Allow-Origin header's value. You can also configure a site to allow any site to access it by using the * wildcard. You should only use this for public APIs.


2 Answers

You've got two ways to go forward:

JSONP


If this API supports JSONP, the easiest way to fix this issue is to add &callback to the end of the URL. You can also try &callback=. If that doesn't work, it means the API does not support JSONP, so you must try the other solution.

Proxy Script


You can create a proxy script on the same domain as your website in order to avoid the cross-origin issues. This will only work with HTTP URLs, not HTTPS URLs, but it shouldn't be too difficult to modify if you need that.

<?php // File Name: proxy.php if (!isset($_GET['url'])) {     die(); // Don't do anything if we don't have a URL to work with } $url = urldecode($_GET['url']); $url = 'http://' . str_replace('http://', '', $url); // Avoid accessing the file system echo file_get_contents($url); // You should probably use cURL. The concept is the same though 

Then you just call this script with jQuery. Be sure to urlencode the URL.

$.ajax({     url      : 'proxy.php?url=http%3A%2F%2Fapi.master18.tiket.com%2Fsearch%2Fautocomplete%2Fhotel%3Fq%3Dmah%26token%3D90d2fad44172390b11527557e6250e50%26secretkey%3D83e2f0484edbd2ad6fc9888c1e30ea44%26output%3Djson',     type     : 'GET',     dataType : 'json' }).done(function(data) {     console.log(data.results.result[1].category); // Do whatever you want here }); 

The Why


You're getting this error because of XMLHttpRequest same origin policy, which basically boils down to a restriction of ajax requests to URLs with a different port, domain or protocol. This restriction is in place to prevent cross-site scripting (XSS) attacks.

More Information

Our solutions by pass these problems in different ways.

JSONP uses the ability to point script tags at JSON (wrapped in a javascript function) in order to receive the JSON. The JSONP page is interpreted as javascript, and executed. The JSON is passed to your specified function.

The proxy script works by tricking the browser, as you're actually requesting a page on the same origin as your page. The actual cross-origin requests happen server-side.

like image 79
Nate Higgins Avatar answered Oct 12 '22 11:10

Nate Higgins


I fixed this (for development) with a simple nginx proxy...

# /etc/nginx/sites-enabled/default server {   listen 80;   root /path/to/Development/dir;   index index.html;    # from your example   location /search {     proxy_pass http://api.master18.tiket.com;   } } 
like image 34
jmervine Avatar answered Oct 12 '22 12:10

jmervine