问一个 nginx 相关的问题!

2019-06-25 19:34:01 +08:00
 sologgfun

起因是这篇文章

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 就是把我请求的所有资源一起在它那里请求完给我。不是吗?

1991 次点击
所在节点    问与答
13 条回复
momocraft
2019-06-25 19:39:33 +08:00
为什么不自己试一下呢
misaka19000
2019-06-25 19:48:38 +08:00
绝对路径或相对路径都是浏览器发起的请求,只不过相对路径能命中 Nginx 而绝对路径无法命中 Nginx 而已
imdong
2019-06-25 19:51:54 +08:00
是的,绝对路径是真的绝对不会变得。

但是,你可以在 nginx 替换 b.coma.com
或者在页面头部加一个自己的 js
js 接管页面的加载错误,把错误地址改成正确的重新请求。
jiao
2019-06-25 19:54:45 +08:00
你写个 baidu.com 绝对路径的 img 标签,浏览器请求的图片压根跟你服务器没关系啊。
ochatokori
2019-06-25 19:56:46 +08:00
是的,这个图片对于浏览器来说是个跨域资源,会直接向 b 获取资源

同样的问题可能还会出现在 30x 重定向上,a 有可能会被重定向到 b
MonoLogueChi
2019-06-25 20:01:33 +08:00
第一个是绝对路径,第二个是 URL。
先说第一个的行为,浏览器解析标签,知道请求 a.com/foo.gif 可以得到这张图片,就去发起这个请求
再说第二个,浏览器解析之后一看,这张图片的地址是 b.com/foo.gif ,就去发起这个请求
waytostand
2019-06-25 20:06:39 +08:00
6 楼正解
sologgfun
2019-06-25 20:32:35 +08:00
@momocraft 主要这个要试一下感觉还有点麻烦,,所以直接问一下 h
msg7086
2019-06-25 23:13:02 +08:00
> “把我请求的所有资源一起在它那里请求完给我”

HTTP 不是这样工作的。
HTTP 是一次只返回一个资源,浏览器读取文件以后,再次解析然后再次向服务器请求后续资源。
所以不存在“一起请求”这个过程,也不会出现“请求的所有资源”这样的东西。
hlwjia
2019-06-25 23:30:30 +08:00
我的天,首先别说绝对不绝对路径的

第二个 url 你期望他也经过你的 nginx ? render 那个地方的是浏览器啊,浏览器发起的 b 站请求就因为这个是 a 站 render 出来的页面所以要经过你的 nginx。

那么 cdn 拿来干嘛?
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
also24
2019-06-25 23:40:23 +08:00
仔细看了下那个文章,它用 JS hook 方式处理了内容替换的问题,那就不需要 nginx 操心了。
sologgfun
2019-06-26 08:44:52 +08:00
是我自己误解了,现在懂了,感谢哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX