概述
301 永久重定向的缓存问题
问题描述
在使用 301 的时候常常会遇到一个问题:当服务端针对某个 URL 设置了 301 永久重定向后,不管怎么重新设置或者删除设置,浏览器在进行访问时仍然会使用最开始缓存的 301 重定向,而服务端无法控制用户将原来的重定向配置进行删除。
对于用户来说,刚开始服务端设置了 301 重定向时,浏览器能看到 301 的响应,也能正常访问资源。但是在 301 重定向重新被设置后,浏览器还是会访问原来重定向的资源,即便该资源已经失效。
首先,在 nginx.conf
文件中要添加以下类似的配置:
server {
listen 80;
server_name redirect.com;
root /directory/redirect;
location /origin {
# 永久重定向
rewrite ^/origin http://redirect.com/301 permanent;
# # 临时重定向
# rewrite ^/origin http://redirect.com/302 redirect;
}
location /301 {
try_files $uri /redirect301.html$is_args$args;
}
location /302 {
try_files $uri /redirect302.html$is_args$args;
}
}
配置文件中先开启了 301 永久重定向,此时在浏览器访问 http://redirect.com/origin
就会重定向到 http://redirect.com/redirect301.html
,该重定向会被浏览器缓存起来。当我们关闭配置文件的 301 规则,然后打开 302 重定向规则,重新在浏览器访问相同链接时,浏览器依然会按照 301 规则进行重定向,而不是遵循 302 的规则。
问题分析
出现上述问题的根本原因是,浏览器基本都会缓存 301 永久重定向的设置,随后不再接收之后其他的重定向设置。这个是由 HTTP RFC 规定的,当响应结果没有明确提供缓存的配置时,浏览器就会默认永久缓存 301 配置。
处理方案
解决问题的核心,就是在于如何有效地清理用户端的 301 缓存。
清理缓存的常用方法,包括清除浏览器的历史记录、在 Network 面板清楚缓存等,但这些操作都只有在用户操作界面才能进行。当我们将 301 规则发布到生产环境后,只能被动地通知用户进行缓存清理操作,然而并不能保证用户一定会依照指引清除缓存。
为了避免上述的情况出现,一个比较有效的方法是,在第一次请求的响应头中,显式指定不缓存。相应的 nginx.conf
文件可以改成下面的形式:
server {
listen 80;
server_name redirect.com;
root /directory/redirect;
location /origin {
add_header Cache-Control no-cache
# 永久重定向
rewrite ^/origin http://redirect.com/301 permanent;
# # 临时重定向
# rewrite ^/origin http://redirect.com/302 redirect;
}
location /301 {
try_files $uri /redirect301.html$is_args$args;
}
location /302 {
try_files $uri /redirect302.html$is_args$args;
}
}
其中 Cache-Control no-cache
也可以改成 Cache-Control no-store
。这样配置之后,重定向的结果就不会被浏览器缓存起来,而是实时根据服务响应结果进行重定向。
最后
以上就是隐形龙猫为你收集整理的【计算机网络】301 永久重定向的缓存问题301 永久重定向的缓存问题的全部内容,希望文章能够帮你解决【计算机网络】301 永久重定向的缓存问题301 永久重定向的缓存问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复