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

一个类似 反代 的实现问题,详细情况戳

  •  
  •   aprikyblue · 2015-10-05 14:33:15 +08:00 · 1367 次点击
    这是一个创建于 3151 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题是这样,现在有
    站点 x (受控制)、站点 a b c (不在我控制)

    要求:

    • 访问站点 x 的 /a/* -> x 判断是否存在 /a/* -> 是则直接返回,否则回源 a 抓取 /* 并返回
    • 访问站点 x 的 /b/* -> x 判断是否存在 /b/* -> 是则直接返回,否则回源 b 抓取 /* 并返回
    • c 同理

    ( x 上的文件可能与源不同,并且回源抓取后 x 不保存文件)

    仅仅以上简单的判断是否存在的话,用 nginx 的 rewrite/try_files 和 proxy_pass 实现了

    现在要求“判断是否存在”这一步后更改为:

    根据客户端的 cookie/session 进行判定(可能进行数据库查询
    ->
    如果符合条件,则根据 cookie/session 返回 x 上的不同版本
    如果不符合条件,则回源抓取并返回

    这样只用 nginx 配置不行了吧。。

    试着用 rewrite + php 实现了一个,效果不佳(对 http 协议部分处理不如现成的 proxy 模块完善)

    有没有办法 判定要回源时 再移交回 nginx 的 proxy 模块 处理?
    或者 各位 V 友有什么好的实现方案?
    (最好不要用 HTTP 重定向而是直接返回 200+内容,因为访问 x 的 client 也不在我控制,并且处理不太完善,可能不会处理重定向)

    5 条回复    2015-10-06 21:19:03 +08:00
    ryd994
        1
    ryd994  
       2015-10-05 16:28:55 +08:00   ❤️ 1
    反代放到 named location 里( location @xxx
    location /a/ 设置 error_page 403 到反代 location , fastcgi_intercept_errors on
    PHP 判断不符合条件就返回 403
    你也可以使用其他 errorcode
    msg7086
        2
    msg7086  
       2015-10-06 02:01:04 +08:00
    nginx 当然要用 lua 大法。
    aprikyblue
        3
    aprikyblue  
    OP
       2015-10-06 16:40:36 +08:00
    @ryd994
    试了下可以,但是用 error_page 的话好像会一直返回这个 error code ,而不会返回 proxy 源端的状态码。。


    @msg7086 能用 lua ?没试过..
    ryd994
        4
    ryd994  
       2015-10-06 21:14:27 +08:00 via Android
    @aprikyblue 那就使用其他数字, 4 开头 5 开头的都可以啊
    msg7086
        5
    msg7086  
       2015-10-06 21:19:03 +08:00
    @aprikyblue openresty ,可以访问 cookie/session/数据库,你可以看看能不能满足你的要求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3565 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:28 · PVG 13:28 · LAX 22:28 · JFK 01:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.