.. _grab_redirect:
Redirect Handling
=================
Grab supports two types of redirects:
* HTTP redirects with HTTP 301 and 302 status codes
* HTML redirects with the HTML tag
HTTP 301/302 Redirect
---------------------
By default, Grab follows any 301 or 302 redirect. You can control the maximum number
of redirects per network query with the :ref:`option_redirect_limit` option. To completely
disable handling of HTTP redirects, set :ref:`option_follow_location` to False.
Let's see how it works::
>>> g = Grab()
>>> g.setup(follow_location=False)
>>> g.go('http://google.com')
>>> g.response.code
301
>>> g.response.headers['Location']
'http://www.google.com/'
>>> g.setup(follow_location=True)
>>> g.go('http://google.com')
>>> g.response.code
200
>>> g.response.url
'http://www.google.ru/?gws_rd=cr&ei=BspFUtS8EOWq4ATAooGADA'
Meta Refresh Redirect
---------------------
An HTML Page could contain special tags that instructs the browser to go to a specified URL::
By default, Grab ignores such instructions. If you want automatically follow meta refresh
tags, then set :ref:`option_follow_refresh` to True.
Original and Destination URLs
-----------------------------
You can always get information about what URL you've requested initially and what URL you ended up with::
>>> g = Grab()
>>> g.go('http://google.com')
>>> g.config['url']
'http://google.com'
>>> g.response.url
'http://www.google.ru/?gws_rd=cr&ei=8spFUo32Huem4gT6ooDwAg'
The initial URL is stored on the config object. The destination URL is written into `response` object.
You can even track redirect history with `response.head`::
>>> print g.response.head
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Fri, 27 Sep 2013 18:19:13 GMT
Expires: Sun, 27 Oct 2013 18:19:13 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
HTTP/1.1 302 Found
Location: http://www.google.ru/?gws_rd=cr&ei=IsxFUp-8CsT64QTZooDwBA
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Date: Fri, 27 Sep 2013 18:19:14 GMT
Server: gws
Content-Length: 258
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
HTTP/1.1 200 OK
Date: Fri, 27 Sep 2013 18:19:14 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked