V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sologgfun
V2EX  ›  问与答

问一个 nginx 相关的问题!

  •  
  •   sologgfun · 2019-06-25 19:34:01 +08:00 · 2194 次点击
    这是一个创建于 2011 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因是这篇文章

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

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

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

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

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

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

    那么 cdn 拿来干嘛?
    also24
        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
    also24
        12
    also24  
       2019-06-25 23:40:23 +08:00
    仔细看了下那个文章,它用 JS hook 方式处理了内容替换的问题,那就不需要 nginx 操心了。
    sologgfun
        13
    sologgfun  
    OP
       2019-06-26 08:44:52 +08:00
    是我自己误解了,现在懂了,感谢哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1534 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:01 · PVG 01:01 · LAX 09:01 · JFK 12:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.