起因是这篇文章
https://github.com/EtherDream/jsproxy/blob/master/docs/blogs/js-hook.md
里面有这样一段描述
举个例子,假如我们用 a.com 反向代理 b.com ,并且 b.com 有如下网页:
<img src="/foo.gif">
<img src="http://b.com/bar.gif">
第一个 img 是相对路径。由于当前实际地址是 a.com ,因此最终访问的 URL 是 http://a.com/foo.gif 。我们的后端服务器收到请求后,抓取 http://b.com/foo.gif 的内容并返回给用户。这没有问题。
第二个 img 是绝对路径,这就有问题了!浏览器会直接访问 b.com ,根本不经过我们的后端。而 b.com 是无法直接访问的,于是图片加载失败。
我的问题是:难道我用 nginx 反向代理页面的话,绝对路径的资源真的都不会经过 nginx 这层吗?
有老哥给我科普一下吗,这和我的理解不一样阿,我一直以为 nginx 就是把我请求的所有资源一起在它那里请求完给我。不是吗?
1
momocraft 2019-06-25 19:39:33 +08:00
为什么不自己试一下呢
|
2
misaka19000 2019-06-25 19:48:38 +08:00
绝对路径或相对路径都是浏览器发起的请求,只不过相对路径能命中 Nginx 而绝对路径无法命中 Nginx 而已
|
3
imdong 2019-06-25 19:51:54 +08:00
|
5
ochatokori 2019-06-25 19:56:46 +08:00 via Android
是的,这个图片对于浏览器来说是个跨域资源,会直接向 b 获取资源
同样的问题可能还会出现在 30x 重定向上,a 有可能会被重定向到 b |
6
MonoLogueChi 2019-06-25 20:01:33 +08:00 via Android
第一个是绝对路径,第二个是 URL。
先说第一个的行为,浏览器解析标签,知道请求 a.com/foo.gif 可以得到这张图片,就去发起这个请求 再说第二个,浏览器解析之后一看,这张图片的地址是 b.com/foo.gif ,就去发起这个请求 |
7
waytostand 2019-06-25 20:06:39 +08:00 via iPhone
6 楼正解
|
9
msg7086 2019-06-25 23:13:02 +08:00
> “把我请求的所有资源一起在它那里请求完给我”
HTTP 不是这样工作的。 HTTP 是一次只返回一个资源,浏览器读取文件以后,再次解析然后再次向服务器请求后续资源。 所以不存在“一起请求”这个过程,也不会出现“请求的所有资源”这样的东西。 |
10
hlwjia 2019-06-25 23:30:30 +08:00 via iPhone
我的天,首先别说绝对不绝对路径的
第二个 url 你期望他也经过你的 nginx ? render 那个地方的是浏览器啊,浏览器发起的 b 站请求就因为这个是 a 站 render 出来的页面所以要经过你的 nginx。 那么 cdn 拿来干嘛? |
11
also24 2019-06-25 23:37:17 +08:00
> nginx 就是把我请求的所有资源一起在它那里请求完给我。
划掉 『一起』二字之后确实是正确的。 但是你需要注意的是,浏览器请求 http://b.com/bar.gif 的时候,并不需要经过你的 nginx,也就是说前提都不满足。 想要达到 http://b.com/bar.gif 这种资源也能处理的目的的话,就需要做内容替换,例如把所有的 『 b.com 』都替换为 『 a.com 』。 你可以参考这个模块: http://nginx.org/en/docs/http/ngx_http_sub_module.html 或者第三方模块: https://github.com/yaoweibin/ngx_http_substitutions_filter_module |
12
also24 2019-06-25 23:40:23 +08:00
仔细看了下那个文章,它用 JS hook 方式处理了内容替换的问题,那就不需要 nginx 操心了。
|
13
sologgfun OP 是我自己误解了,现在懂了,感谢哈哈
|