今天总结的东西被胡老师看到可能会被骂,因为是以前遇到过的研究过得,但是今天才是真正因为被坑了,才深深理解了以前了解的知识。
情景描述
- 使用ngixn做反向代理服务器,使用express作为后端服务器
- nginx的配置如下
server { listen 8089; server_name localhost; location /test/ { proxy_pass http://localhost:3000/; }
- 后端服务器如下:
app.get('/a', function (req, res) { res.send('bbbbbbbb'); }) app.get('/', function (req, res) { res.redirect(301, 'https://www.baidu.com'); });
- 发现当我请求
http://localhost:8089/test
这时候浏览器跳转到百度 - 但是当我修改后端服务器之后的跳转地址为
http://localhost:3000/a
之后,在当前浏览器再请求http://localhost:8089/test
永远只能跳转到百度 - 及时当我点击chrome上的
disable cached
结果仍然一样。 - 然后我重新打开一个浏览器发现请求终于不跳转到百度了。
- 跳转了
http://localhost:8089/test/a
很恼火,明明我请求的时候待了域http://localhost:3000但是我看到的请求路径变了 - 而且连301response中的location也变了。
矛盾点
- 当我修改了后端服务器的301 location的时候发现浏览器竟然还是跳转原来的地址。如果是缓存的原因,我清除缓存的之后就应该能够正常跳转了但是还是跳转到原来的地址
- 而且我的重定向地址带了域为什么还是变成了nginx的域呢?
301状态码到底有什么样作用,会导致浏览器做什么?
-
所有的重定向响应都必备两个部分:
- 第一个:3**状态码
- 第二个:响应头中的location字段
- 当浏览器接收到301的响应,浏览器
- 浏览器首先从response header中取出location字段
- 然后直接向location的地址发送请求
(以上两个步骤其实是浏览器在做重定向) - 当服务器处理完此次请求之后将response发送回浏览器就相当于此次重定向的response处理完 毕
- 当你再次发送这个response是301的请求的时候
- 发回301状态码的服务器再也没有接受过请求。
- 因此推断,浏览器会记录收到301response的请求url并且将location也存下。
- 每当你请求这个url,浏览器就会从自己的存储器中拿出location直接跳转。
- 当你清除浏览器缓存的时候,这种永久重定向是没有办法被清除的。除非你换一个浏览器。至于为什么有没有别的办法这里我还没研究。下回分解吧。
---> 以上三点就解释了为什么当你的服务器修改了301response的location,再次请求url的时候location依旧不变的原因。
302状态码和301状态码有什么区别
- 之前我曾经梳理过他们的区别,但是现在换一种方式说明。
- 301:当某个url请求后拿回301,以后不会请求多少次这个url,浏览器都不会把这个url请求发送给服务器。
- 简单说:返回301的服务器针对同一个浏览器只会处理一次这个请求,以后对这个url的处理都是浏览器自己进行的,不会再发给服务器了。
- 302:当某个url请求后拿回302。
- 浏览器不但会在每次请求的时候都做重定向
- 而且每次都会将这个url的请求发往给后端处理。绝对不会擅自用以前存储的location直接跳转。
- 301:当某个url请求后拿回301,以后不会请求多少次这个url,浏览器都不会把这个url请求发送给服务器。
为什么使用nginx反向代理之后,我的response的location中的域会被替换?
-
这里要修改一个本人的认知错误:一直以为nginx做反向代理服务器就是转发请求,但是response ngixn是不会经手直接发给浏览器的。其实这个认知是错误的。nginx作为反向代理服务器,会做五件事:
- 修改request url
- 路由request
- 接收response
- 替换response的域
- 返回给浏览器
这就是必须遵循的:请求是谁发的response就会到谁的手上
-
请求
url:http://localhost:8089/test
发送到nginx.nginx通过配置知道http://localhost:8089/test
代理的是http://localhost:3000
就相当于修改url的时候遵循
http://localhost:8089/test == http://localhost:3000
- nginx修改url: http://localhost:3000
- 发送请求
- 接受response:发现location是
http://localhost:3000/a
立刻替换为http://localhost:8089/test/a
- 返回给浏览器。
这时候就可以解释,不论任何的反向代理服务器,他们都是通过修改request和response的url让浏览器看到永远都只有自己这么一个服务器,所有的请求都是发往反向代理服务器的。
nginx如果可以先接收到3**响应,那么他会直接做重定向吗?
- 在没有做配置的时候,nginx绝对不会内部做重定向的!nginx会把重定向response送回给浏览器,让浏览器做
反思
- 理论没有联系实践,知识迁移能力还是有问题
action
- 以后学习所有概念必须至少列出一个例子。不能干说概念。