I am debugging a problem with a HTTP 301 Permanent Redirect. After a quick test, it seems that Safari clears its cache of 301s when it is restarted, but Firefox does not.
When do IE, Chrome, Firefox and Safari clear their cache of 301s?
UPDATE: For example, if I want to redirect example1.com
to example2.com
, but I accidentally set it to redirect to example3.com
, that is a problem. I can correct the mistake, but anyone who has visited example1.com
in the meantime will have cached the incorrect redirect to example3.com
, and so they will not be able to reach either example1.com
or example2.com
until their cache is cleared. Upon investigation, I find that there were no Cache-Control
and Expires
headers set. The headers for the incorrect 301 response would have been like this:
HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://example3.com/
Content-Type: text/html
My own tests show that:
This question is related to
http
http-status-code-301
Make the user submit a post form on that url and the cached redirect is gone :)
<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
<input type="submit" value="fix" />
</form>
</body>
Test your redirects using incognito/InPrivate mode so when you close the browser it will flush that cache and reopening the window will not contain the cache.
I have simple solution that worked on all major browser (latest version), includes IE, Chrome and FF
For testing purposes (to avoid cached redirects), people can open NEW PRIVATE WINDOW: click CTRL+SHIFT+
N
[if you use Mozilla, use P
]
Confirmed!! make the user submit a post request to the affected url and the cached redirect is forgotten.
A quick win would be to enter this in the browser console if you can:
fetch('example.com/affected/link', {method: 'post'}).then(() => {})
Useful if you know the affected browser (especially during development).
Alternatively, if you have access to the previous 301 redirect page, then you can add this script to the page and anytime it is visited, the cached 301 will be forgotten.
An answer that helps those who desperately want to get rid of the redirect cache:
Chrome caches the 301 redirect infinitely (in the local disk cache). To clear this cache:
F12
)F5
)When everything is okay, you can uncheck "Disable cache" and everything will continue to work as expected.
301
is a cacheable response per HTTP RFC and browsers will cache it depending on the HTTP caching headers you have on the response. Use FireBug or Charles to examine response headers to know the exact duration the response will be cached for.
If you would like to control the caching duration, you can use the the HTTP response headers Cache-Control
and Expires
to do the same. Alternatively, if you don't want to cache the 301
response at all, use the following headers.
Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
As the other answers show. Caching may be indefinetly in browser. This is extremely dangerous. So don't do it. At least add cache headers. In htaccess I always do it this way with no caching at all:
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
# The E=nocache:1 sets the environment variable nocache to the value of one
RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>
<IfModule mod_headers.c>
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>
If you didn't had no caching of 301 redirects in the past, you must redirect back to the source from the target. Example:
If you had this
RewriteRule /my-source /my-target [L,R=301]
You need to put this
# RewriteRule /my-source /my-target [L,R=301]
RewriteRule /my-target /my-source [L,R=301]
as answer of @thomasrutter
If you previously issued a 301 redirect but want to un-do that
If people still have the cached 301 redirect in their browser they will continue to be taken to the target page regardless of whether the source page still has the redirect in place. Your options for fixing this include:
The simplest and best solution is to issue another 301 redirect back again.
The browser will realise it is being directed back to what it previously thought was a decommissioned URL, and this should cause it re-fetch that URL again to confirm that the old redirect isn't still there.
If you don't have control over the site where the previous redirect target went to, then you are outta luck. Try and beg the site owner to redirect back to you.
In fact, this means:
a.com 301 to b.com
delete a.com 's 301
add b.com 301 to a.com
Then it works.
In the absense of cache control directives that specify otherwise, a 301 redirect defaults to being cached without any expiry date.
That is, it will remain cached for as long as the browser's cache can accommodate it. It will be removed from the cache if you manually clear the cache, or if the cache entries are purged to make room for new ones.
You can verify this at least in Firefox by going to about:cache
and finding it under disk cache. It works this way in other browsers including Chrome and the Chromium based Edge, though they don't have an about:cache
for inspecting the cache.
In all browsers it is still possible to override this default behavior using caching directives, as described below:
If you don't want the redirect to be cached
This indefinite caching is only the default caching by these browsers in the absence of headers that specify otherwise. The logic is that you are specifying a "permanent" redirect and not giving them any other caching instructions, so they'll treat it as if you wanted it indefinitely cached.
The browsers still honor the Cache-Control and Expires headers like with any other response, if they are specified.
You can add headers such as Cache-Control: max-age=3600
or Expires: Thu, 01 Dec 2014 16:00:00 GMT
to your 301 redirects. You could even add Cache-Control: no-cache
so it won't be cached permanently by the browser or Cache-Control: no-store
so it can't even be stored in temporary storage by the browser.
Though, if you don't want your redirect to be permanent, it may be a better option to use a 302 or 307 redirect. Issuing a 301 redirect but marking it as non-cacheable is going against the spirit of what a 301 redirect is for, even though it is technically valid. YMMV, and you may find edge cases where it makes sense for a "permanent" redirect to have a time limit. Note that 302 and 307 redirects aren't cached by default by browsers.
If you previously issued a 301 redirect but want to un-do that
If people still have the cached 301 redirect in their browser they will continue to be taken to the target page regardless of whether the source page still has the redirect in place. Your options for fixing this include:
A simple solution is to issue another redirect back again.
If the browser is directed back to a same URL a second time during a redirect, it should fetch it from the origin again instead of redirecting again from cache, in an attempt to avoid a redirect loop. Comments on this answer indicate this now works in all major browsers - but there may be some minor browsers where it doesn't.
If you don't have control over the site where the previous redirect target went to, then you are out of luck. Try and beg the site owner to redirect back to you.
Prevention is better than cure - avoid a 301 redirect if you are not sure you want to permanently de-commission the old URL.
To clear a permanent redirect, go to chrome://settings/clearBrowserData and from there only clearing "cached images and files" cleared the redirect.
Go to chrome://net-internals. On the right of the top red status bar, click on the down arrow ? to open the drop-down menu, and under the "Tools" group, choose "Clear cache".
As of version 48, this was the only thing that worked for me to clear a cached 301.
I will post answer that helped me:
go to url:
chrome://settings/clearBrowserData
it should invoke popup and then..
cached images and files
.from beginning
To solve the issue for a localhost address I changed the port number the site ran under. This worked on Chrome version 73.0.3683.86.
Source: Stackoverflow.com