How to prevent ajax requests to follow redirects using jQuery

javascript, jquery

Solution

I find your question interesting, but the problem in whole seems me more a misunderstanding. At least I'll try to explain my understanding of the problem.

The silent (transparent) redirection is the part of `XMLHttpRequest` specification (see here especially the words "... transparently follow the redirect ..."). The standard mention only that the user agent (the web browser) can prevent or notify of certain kinds of automatic redirections, but it's not a part of `XMLHttpRequest`. It's the part of HTTP client configuration (OS configuration) or the web browser configuration. So `jQuery.ajax` can't have any option where you can prevent redirection.

You can see that HTTP redirection is the part of HTTP protocol and not a part of `XMLHttpRequest`. So it's on the another level of abstraction or the network stack. For example the data from the `XMLHttpRequest` can be retrieved from the HTTP proxy or from the local browser cache, and it's the part of HTTP protocol. Mostly the server which provide the data and not the client can influence on caching.

You can compare the requirement from your question with the requirement to prevent changing of IP address of the web server or the changing of the IP route during the communication. All the things can be interesting in some scenarios, but there are parts of another level of the communication stack and can't be managed by `jQuery.ajax` or `XMLHttpRequest`.

The `XMLHttpRequest` standard say that the client configuration can have options which prevent redirection. In case of "Microsoft world", which I better know, you can look at WinHttpSetOption function which can be used to set `WINHTTP_OPTION_DISABLE_FEATURE` option with the `WINHTTP_DISABLE_REDIRECTS` value. Another way are the usage of `WINHTTP_OPTION_REDIRECT_POLICY` option with the `WINHTTP_OPTION_REDIRECT_POLICY_NEVER` value. One more feature which one can use in Windows is the WinHttpSetStatusCallback function which can set callback function received some notifications like `WINHTTP_CALLBACK_FLAG_REDIRECT`.

So it's do possible to implement your requirements in general, but the solution will be probably not independent from the operation system or the web browser and be not on the level of `jQuery.ajax` or `XMLHttpRequest`.

Problem

I use the jQuery ajax functions to access a web service, but the server, instead of returning a response with a status code describing a problem, the request is redirected to a page with a 200 header, describing the problem. I can't make any changes to this, so I need to solve it on the client somehow. Example: A request goes to some URL which is not found, so I receive a 302 Redirect to another location. A new request is sent, and I receive a 200 OK, thus preventing the error callback to fire. Is there some way I can prevent the ajax request to follow redirects and instead invoke a callback, preferably the error method. Alternatively, is it possible to detect if a redirect has happened in the client?

Original source

Related problems