V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
powerman
V2EX  ›  Node.js

有偿求助: nginx 域名隐性(地址栏域名不变)跳转

  •  
  •   powerman · 140 天前 · 4544 次点击
    这是一个创建于 140 天前的主题,其中的信息可能已经有所发展或是发生改变。

    跪求大神,帮助实现一个关键功能:域名隐性跳转(也称为域名掩码或隐形重定向)。具体需求如下:

    隐性跳转实现: 所有输入的域名在用户浏览器地址栏中保持不变,但实际内容从目标 URL 加载。 需要处理的域名除了数字英文,还包含特殊字符(如 emoji 、中文、日文等)。 例如,当用户在地址栏访问 1.aaa.com ,服务器基于 API 查询“1.aaa”指向的页面如“bbb”,则跳转目标 URL 为 ccc.com/bbb ,但是地址栏域名不变仍显示 1.aaa.com 。 其他都实现了,就是这个隐性跳转搞不定,ccc.com 不允许跨域访问,没办法代理它的内容。

    技术要求: 服务器端技术:nodejs Nginx pm2 代理目标 URL 是基于 API 指向的页面。

    77 条回复    2024-08-09 12:03:57 +08:00
    xiaoming1992
        1
    xiaoming1992  
       140 天前 via Android
    你到底希望显示 bbb 的内容还是 ccc.com/bbb 的内容?
    xiaoming1992
        2
    xiaoming1992  
       140 天前 via Android
    aaa 是你自己的,bbb 和 ccc 不是你自己的,对吧?
    ysc3839
        3
    ysc3839  
       140 天前
    稳妥的方案只有用浏览器端 Service Worker 拦截请求,像其他文本替换之类的方案,副作用都太大了。
    CnpPt
        4
    CnpPt  
       140 天前
    好像有 DNS 厂家做过这个功能,实现是网页 iframe😂
    chenxuuu
        5
    chenxuuu  
       140 天前
    直接用 nginx 跑个 lua 模块就能实现吧?
    https://poe.com/s/SbO790ZFitf1Dogp2ovc
    om2mo
        6
    om2mo  
       140 天前
    nginx 配置 node.js api 转发到 node.js 由它来处理域名隐形跳转
    chenzhe
        7
    chenzhe  
       140 天前
    🐎一个学习一下。
    efcndi
        8
    efcndi  
       140 天前
    很多域名注册商支持域名转发,本身就可以选择这种转发方式,比如 Spaceship 。
    pagxir
        9
    pagxir  
       139 天前 via Android
    反向代理
    powerman
        10
    powerman  
    OP
       139 天前
    @xiaoming1992 是的,bbb 是一个字段值,ccc.com 是别人的
    powerman
        11
    powerman  
    OP
       139 天前
    @chenxuuu 谢谢,这个尝试过没有成功
    ericguo
        12
    ericguo  
       139 天前
    朋友,你这是在做黑产啊!
    powerman
        13
    powerman  
    OP
       139 天前
    @ericguo 跳转的是协议官方的网站,这里有黑产什么事??
    Qiss
        14
    Qiss  
       139 天前   ❤️ 10
    OP 哪来那么多奇奇怪怪的词,反向代理就是。
    rrfeng
        15
    rrfeng  
       139 天前 via Android
    一个 rewrite 指令完事,给我 1000 包教会。
    powerman
        16
    powerman  
    OP
       139 天前
    @rrfeng 你好怎么联系
    0x5c0f
        17
    0x5c0f  
       139 天前
    不是,随便找一个 AI 工具问下就行了
    xxs55
        18
    xxs55  
       139 天前
    cdn 不就可以了
    coolloves
        19
    coolloves  
       139 天前
    感觉就是反代下就完事了吧
    根据需求做一些细节的配置.
    kissice
        20
    kissice  
       139 天前
    下面这样不晓得可以不
    ```config
    location / {
    proxy_cookie_domain ~ ccc.com;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass https://ccc.com/bbb;
    }
    ```
    coolloves
        21
    coolloves  
       139 天前
    @Qiss 是啊,一顿描述猛如虎,感觉需求就是一个反代就完事了
    zhtyytg
        22
    zhtyytg  
       139 天前
    @Qiss 确实,看了一长串终于反应过来是反代。
    sss15
        23
    sss15  
       139 天前
    似乎反代只能解决开始的问题,反代回来的 html 里应用的 js 譬如是 http://ccc.com/static/1.js ,这应该是可以加载的,应该没啥大问题
    关键问题是 js 里的请求又是 http://ccc.com/api/action 这样的地址,对方网站又是不允许跨域的,他请求回来的网站就没办法正常显示了
    wnpllrzodiac
        24
    wnpllrzodiac  
       139 天前 via Android
    这不就是跳板机么。内容是服务器转发给浏览器的吧。如果是 302,浏览器地址会变得
    xubeiyou
        25
    xubeiyou  
       139 天前
    可能是理解有误 感觉不只是反代- - 一个 rewrite 不够的样子- -
    wnpllrzodiac
        26
    wnpllrzodiac  
       139 天前 via Android
    要做完善比较困难,因为页面里面会有静态的访问地址,需要动态改页面内容。这种一般 case by case.可以私我交流下。
    powerman
        27
    powerman  
    OP
       139 天前
    @kissice 现在是类似这样写的没错,但是没有实现
    xuAN111
        28
    xuAN111  
       139 天前
    你百度搜一下反代,几分钟就会了。
    totoro625
        29
    totoro625  
       139 天前
    @kissice #20 同样的需求+1
    proxy_pass 或许 rewrite 会 302 跳转
    如果要说具体技术实现的话,在 CDN 里有一个词叫“回源跟随 301/302”: https://cloud.baidu.com/doc/CDN/s/klk80mlnh
    liuidetmks
        30
    liuidetmks  
       139 天前
    浏览器不是吃素的
    再说了,人家 js 发请求,请求参数取页面 host ,太多了
    巨坑
    coolloves
        31
    coolloves  
       139 天前
    @sss15
    所以要看细节,有影响的域名都做下反代.然后用 sub_filter 模块做下内容替换.这样,所有的都是你自己的域名了,什么跨域都不存在的.
    LoliconInside
        32
    LoliconInside  
       139 天前
    您要搜索的是否是:反向代理
    root71370
        33
    root71370  
       139 天前
    做不到完美的,如果能做到,那是不是我申请个域名就可以直接套 v2ex.com 了,而且所有功能都能正常使用?
    rrfeng
        34
    rrfeng  
       139 天前
    @powerman
    abistey at gmail
    把需求描述清楚发过来
    xxyang
        35
    xxyang  
       139 天前
    iframe
    sead
        36
    sead  
       139 天前
    zsh2517
        37
    zsh2517  
       139 天前
    如果想抄云厂商(如阿里云)的 DNS 显性隐性跳转。可以看这个,我在隔壁写过

    https://linux.do/t/topic/145420/3?u=zsh2517
    sead
        38
    sead  
       139 天前
    @root71370 你说的这个有人在干,只不过谷歌浏览器不是吃素的,会直接弹红屏警告
    sead
        39
    sead  
       139 天前
    @sss15 那就只能用 nodejs 中间件针对性做处理,改写资源加载地址到特定路由
    Jianrry
        40
    Jianrry  
       139 天前 via iPhone
    我之前接过 2 个单子,和楼主的需求差不多,通过 nginx 反向代理实现的。

    预计工作时间 1-2 个小时,最后两个单子分别收了 50 、100 。

    看到楼上的报价之后,我发现报价还有很大的提示空间。
    powerman
        41
    powerman  
    OP
       139 天前
    @sead 我现在用的就是 cf 的解析,您这个针对我这个问题是可以实现吗
    powerman
        42
    powerman  
    OP
       139 天前
    @Jianrry 你好麻烦看一下 gmail
    jiangzm
        43
    jiangzm  
       139 天前
    @Jianrry #40 这个要看目标网站内容实现,有点网站不写死域名请求,跟随当前 document domain ,如果这样只是个反向代理了。如果网站内容写死了域名 处理起来就麻烦一点。
    sead
        44
    sead  
       139 天前
    @powerman CF 边缘处理这种也比较灵活, 根据情况转发数据就行,不过你的需求描述没完全看明白
    powerman
        45
    powerman  
    OP
       139 天前
    @sead 方便留个 gmail 联系吗
    Jianrry
        46
    Jianrry  
       139 天前 via iPhone
    @jiangzm 你说的是 防盗链 吧?

    防盗链 限制了请求头,只允许了指定的域名请求,这限制了反向代理。
    zhangjiashu2023
        47
    zhangjiashu2023  
       139 天前
    做过,邮箱给我发联系方式 [email protected]
    Jianrry
        48
    Jianrry  
       139 天前
    @powerman 你可以通过 telegram ( Jianrry ) 联系我。
    buffzty
        49
    buffzty  
       139 天前
    aHR0cDovL2IubXR3LnNvLzVIM1JqYg== 想要这种效果? nginx 配置一下不就好啦
    powerman
        50
    powerman  
    OP
       139 天前
    @Jianrry 已加
    runlongyao2
        51
    runlongyao2  
       139 天前
    其实就是反代
    ttlive
        52
    ttlive  
       139 天前
    不就是反向代理能实现的事情嘛?
    xuelu520
        53
    xuelu520  
       139 天前
    iframe 应该是最好的选择
    nevermoreluo
        54
    nevermoreluo  
       139 天前
    我有点好奇目标域名是什么了,我想自己动手试试,感觉很简单,但是还是想动手试试。
    因为都是页面但是差别太大了,静态页面当然随便反代一下就好了,实际上后面的 api 以及跨域怎么搞以及目标网站有没有 waf 之类的怎么搞也是问题吧
    yinmin
        55
    yinmin  
       139 天前 via iPhone
    @powerman 如果网页用反代,通常是不能变更目录结构的。目标服务器的目录 /info ,你反代的目录也需要/info 不能/ccc/info ,因为很多网页里引用的 js 、css 很多都用绝对路径写的。
    EmbraceQWQ
        56
    EmbraceQWQ  
       139 天前
    @zsh2517 能给一个隔壁的邀请码吗
    powerman
        57
    powerman  
    OP
       139 天前
    @zhangjiashu2023 你好已发
    zsh2517
        58
    zsh2517  
       139 天前
    @EmbraceQWQ 隔壁我才一级,发不了。需要二级才能发。
    我平常还是 V2EX 刷的多,那边太强调活跃度,不太喜欢这种氛围(比如 “灌水”“前排”)所以看的比较少😂
    liuliancao
        59
    liuliancao  
       139 天前
    和楼上差不多 proxy_pass 就好了 但是这样可能会被封掉
    thatlazyman
        60
    thatlazyman  
       139 天前 via Android
    类似谷歌镜像站
    EmbraceQWQ
        61
    EmbraceQWQ  
       139 天前
    @zsh2517 太可惜了,我在隔壁还想水一波
    buffzty
        62
    buffzty  
       139 天前
    我上面 base64 是个网站 已经把本站给镜像了,配置一下 nginx 和 lua 脚本,几行代码就搞定,可以用子路径反代任意域名 支持绝大多数功能 包括 cookie token.
    比如我的网站 a.com, 你访问 a.com/b.com 就是 b 网站,访问 a.com/c.com 就是 c 网站. 此时在 b c 网站点站内链接不会改变 a.com. 如果要子路径不显示都可以 比如 a.com 返回的东西就是 b.com
    powerman
        63
    powerman  
    OP
       139 天前
    可是我的需求反代的域名和目录都是不固定的,能做吗。
    root71370
        64
    root71370  
       139 天前
    @buffzty 很强,“比如 a.com 返回的东西就是 b.com” 这个可以做个效果看下吗
    seeyoy
        65
    seeyoy  
       139 天前
    nginx
    proxy_pass 后
    sub_filter 了解一下,够用了,可以替换内容
    buffzty
        66
    buffzty  
       139 天前
    @powerman 用一个正则不就反代任意域名 任意路径了,你把你实际需求说下 只要不违法我直接把技术告诉你,不要你钱,网上跟你要钱的绝大多数都是骗子.

    @root71370 h5 的 push history 特性啊,这还用做吗,如果需要刷新还有效 加个 local storage
    powerman
        67
    powerman  
    OP
       139 天前
    @buffzty 方便留个联系方式吗或者 gmail
    buffzty
        68
    buffzty  
       139 天前
    @powerman 直接说实际需求吧,不私,只要不违法我会把方法贴上来
    powerman
        69
    powerman  
    OP
       139 天前
    @buffzty

    正经小工具。

    [需求补充如下]

    我的网站有点类似镜像站 mirror.com
    源站是 example.com

    当用户访问 tom.mirror.com ,我用 js 去查询 API:比如 tom.mirror 返回的值是 uid1 ,那对应的源站的二级目录是 example.com/uid1
    现在需要实现的功能是 用户访问二级域名 tom.mirror.com ,实际指向 example.com/uid1 ,但浏览器地址栏仍然显示 tom.mirror.com

    tom 和 uid 这些都是会变的,不知道这样讲能理解吗

    (特别感谢 V 友 @Jianrry 帮我总结上述需求)
    powerman
        70
    powerman  
    OP
       139 天前
    @buffzty

    现在是这样配置的 nginx

    server {
    listen 80;
    server_name *.mirror.com;

    location / {
    proxy_pass http://localhost/:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
    buffzty
        71
    buffzty  
       139 天前
    用户访问 tom.mirror.com 时 应该是后端查询该代理到哪个 url
    你这个是一对一的 直接反代都足够了,你反代的时候 tom.mirror.com -> example.com, 再重定向到 tom.mirror.com/uid1
    接着修改 反代 resp header 和 body, 遇到 html,js,css 文件修改 example.com url-> tom.mirror.com, 再在 html 文件 顶部注入 js 代码 hook, 比如 hook 网络请求 将所有 example.com->tom.mirror.com.其他的遇到啥 hook 啥 可以 hook 到你跟源站一样 除了域名
    powerman
        72
    powerman  
    OP
       139 天前
    @buffzty 不太理解,我这个 tom 是动态的,单一的反代好像搞不了
    dallaslu
        73
    dallaslu  
       139 天前
    @root71370 “申请个域名就可以直接套”,是这样的没错。比如 hostloc.com 就太多套壳站
    dallaslu
        74
    dallaslu  
       139 天前
    如果你在用 Cloudflare ,那么可以用 Cloudflare Worker 。跳转规则和页面内容替换逻辑都可以非常简单地用 node 实现。
    mlboy
        75
    mlboy  
       138 天前 via iPhone
    vx:bG9zdGRhbmNl
    powerman
        76
    powerman  
    OP
       138 天前
    @dallaslu 感谢,我试了一下真的可以隐性跳转了。就是出其他 bug 了😭
    ruanimal
        77
    ruanimal  
       138 天前
    别自己瞎定义名词,典型的反向代理,但是你可能需要动态配置
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.