8

I am trying to get my angular app to do an $http.get request. Works everywhere but IE8. I am using latest Angular (1.0.6 I think). The only message IE gives is:TypeError:

Access is denied. undefined (in previous angular this was )

My host (nodejs)is set to send cors headers:

res.header('Access-Control-Allow-Origin', '*'); //config.allowedDomains
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Requested-By');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');

I have tried to get more info about the error using debug tools but:

Fiddler: doesn't show xmlhttprequests - seems you can hack your NET app to fix that but not sure what to do with my web page. DebugBar: doesn't show these requests either FirebugLite: 2 version I tried are broken - just random errors and doesn't load

Changing the hosts to same origin clears the issue so I assume it's trying something but man it's hard to debug.

Angular posts on this seem outdated and I am not sure what to do from here.

cyberwombat
  • 38,105
  • 35
  • 175
  • 251
  • 1
    Fiddler totally does show XHR for IE. If it didn't, that would be a HUGE oversight. http://stackoverflow.com/questions/7351238/can-fiddler-to-show-internet-explorer-xhr-traffic – Alan Apr 11 '13 at 23:16
  • Also to be accurate, IE8 and IE9 don't have XHR, but instead do XDomainRequest, or XDR. – Alan Apr 11 '13 at 23:18
  • Well I have read that fiddler post and check setting and for the life of me I cannot see any of these requests. Other posts indicate a proxy has to be set for fiddler to pick these up. And I am aware of the IE8 XHR - XDomainRequest - I just can't seem to fund current Angular docs on this. Some older posts indicate there is no support for XDomainRequests but not sure what current status is - I find it hard to believe that IE8 will not work with Angular $http – cyberwombat Apr 11 '13 at 23:24
  • it's very possible that my setup is what is making Fiddler not work - vmware client to an OSX Nodejs server. Nevertheless the main issue is simply getting IE8 to work – cyberwombat Apr 11 '13 at 23:25
  • Thats how my system is setup (granted I dont test IE8). I do know that $http should work with IE8, so there is likely some other issue. – Alan Apr 12 '13 at 00:00
  • Have you set withCredentials ? see answer to http://stackoverflow.com/questions/15598917/adding-a-custom-header-to-http-request-using-angular-js – Kevin Hakanson Apr 12 '13 at 00:29
  • @KevinHakanson not the issue - I don't use Auth - tried it just in case though – cyberwombat Apr 12 '13 at 02:09

3 Answers3

7

This has nothing to do with $http. $http lets you make XHR(XDR) or JSONP requests. It doesn't provide a mechanism to circumvent the browsers same origin policy.

Changing the hosts to same origin clears the issue so I assume it's trying something but man it's hard to debug.

That's the key to your problem. IE8 doesn't support Cross-Origin-Resource-Sharing (CORS) very well. In order to make cross domain calls with IE8, you better off either:

  1. Use your nodejs app to proxy the request for you, letting you use the same domain.
  2. Use JSONP in your $http.get() request

There are a number of gotchas associated with CORS and IE8, which are outlined here.

Alan
  • 45,915
  • 17
  • 113
  • 134
  • 1
    Seems like I could use XDomainRequest - someone made a fork of angular with support for this but it's outdated now. – cyberwombat Apr 12 '13 at 00:12
  • I would recommend against using XDomainRequest. The Angular folks had a good reason why they didn't merge this feature in, it's not a great solution. If possible in your case, I would just proxy the request either using nodejs or by adding apache with mod_proxy in front of the node app. – OlliM Aug 08 '13 at 08:28
  • OlliM is right, XDR sucks. By default, expressjs's form parser can't parse data that is posted, because XDR only supports text/plain content-types. No custom header support, no preflight requests, etc. – Alan Aug 08 '13 at 23:44
  • Angular 1.2 doesn't support IE<=9 CROS. – Ant Dec 02 '14 at 09:24
3

I was running into this same issue, and while it's likely not ideal, one solution is to change IE's 'Access data sources across domains' security setting to Enable or Prompt:

http://technet.microsoft.com/en-us/library/dd346862.aspx

In my case I was running into the same thing when trying to fetch data (via angular's $resource) from my own API that was hosted on another domain. In IE8 & IE9 these requests would fail with the error you described above. Changing the security setting in IE to allow cross-domain data requests resolved that problem.

Sam Storie
  • 4,444
  • 4
  • 48
  • 74
1

AngularJS doesn't support IE<=9 CORS.

As required, there is a link to github official AngualrJS website :

AngularJS Github official discussion

Ant
  • 1,812
  • 5
  • 22
  • 39