V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
maninnet
V2EX  ›  NGINX

请问一个二级域名如何配置可以访问多个 http 服务?

  •  1
     
  •   maninnet · 1 天前 · 4008 次点击

    我手上只有一个二级域名 sub.abc.com ,但我有一个 alist 和 nas 的 http 服务想通过这个二级域名进行访问,比如 sub.abc.com/alistsub.abc.com/nas 分别访问 alist 和 nas 的管理后台,我尝试通过 nginx 配置 location 的 rewrite 和 sub_filter 都没办法解决,请问有什么解决办法吗?

    76 条回复    2024-12-04 15:07:35 +08:00
    DesnLee
        1
    DesnLee  
       1 天前
    location + proxy_pass
    kumiko
        2
    kumiko  
       1 天前 via Android
    不要 subfolder 容易出问题,建议 sub domain 。nginz 配不来可以使用 Nginx proxy manager ,比较无脑
    maninnet
        3
    maninnet  
    OP
       1 天前 via iPhone
    @DesnLee 我就是这样,不行,首页可以,后面的请求 host 还是 sub.abc.com ,filebname 还是原来的相对路径,我通过 sub_filter 替换,部分可以,但是动态生成的路径就无能为力了。
    maninnet
        4
    maninnet  
    OP
       1 天前 via iPhone
    @kumiko 我只有一个二级域名啊,这个域名不是我的,是其他人提供给我的,我没有权限配置 dns 解析。
    esee
        5
    esee  
       1 天前
    我也想知道,以前自己也想搞但没搞好,最后还是用了不同的域名来解决
    Tiller
        6
    Tiller  
       1 天前
    你请求没办法改的话,无解。我遇到过这种的,基本上要么改代码,要么多域名。
    maninnet
        7
    maninnet  
    OP
       1 天前 via iPhone
    @esee 网上查了挺久,问了几个 ai 都解决不了,上来问问有没有人这么配置过的…难道大家都没有这种需求吗?
    maninnet
        8
    maninnet  
    OP
       1 天前 via iPhone
    @Tiller 代码是改不了的…只能麻烦别人配置多个域名了,改 IP 也很麻烦。
    adoal
        9
    adoal  
       1 天前   ❤️ 5
    sub folder 方式需要下面的程序或者至少它用到的 web 框架按照“我知道自己有可能被苦逼的主人放在一个 sub folder 下面,所以有配置选项让我按照 sub folder 来生成 URL”设计过才行,并不是前端反代做了改写就能搞定的
    lazyyz
        10
    lazyyz  
       1 天前 via Android
    一般都是不同的二级、三级甚至更多级域名对应不同的后端服务
    anonydmer
        11
    anonydmer  
       1 天前   ❤️ 4
    sub.abc.com/alistsub.abc.com/nas 这种都需要 alist 和 nas 应用本身支持 sub url 的,但是往往不是所有的应用都支持
    aaronkk
        13
    aaronkk  
       1 天前
    路径改写不了就试试不同端口吧,反正内部服务自己用不讲究的
    jifengg
        14
    jifengg  
       1 天前
    通用的这些,如果配置完了还不行,一般就是 JavaScript 里路径写死了类似 “/api”,“/public” 之类的,如果你不改源码,那就看看这些服务里的 js 文件,具体问题具体分析,改 js 文件。
    改完一处,部署后发现有那个路径又不对了,再接着改。
    windstill
        15
    windstill  
       1 天前
    试试不同端口吧,反正家用也用不了 80 端口。我 nas 上所有服务都是同一个域名+不同端口区别。
    xiangyuecn
        16
    xiangyuecn  
       1 天前
    https://xx.oo/port------------------8080/xxxx 反代到 http://127.0.0.1:8080/xxxx
    lower
        17
    lower  
       1 天前
    @aaronkk 按 op 描述的场景问题,端口应该正解
    HeHeDaGe
        18
    HeHeDaGe  
       1 天前
    @anonydmer 这是正解,得应用本身支持才可以的
    yinmin
        19
    yinmin  
       1 天前 via iPhone   ❤️ 1
    OP 没做过 web 开发吧,大多数的系统都不支持调整路径的。

    说过故事吧:

    领导:李工,你们团队开发系统测试都过了,准备上线。哦,上线的路径是 /某某路径/

    李工:啊! 不行。这个需求为什么不在开发前提出来,现在都已经开发测试完成了,改路径要重新返工,工作量巨大,还要重新测试,开发+测试最起码要 2 周时间。

    领导:你们开发的时候就要考虑部署到不同的路径,为什么要返工?

    李工:你看系统需求文档里就没有这条啊,现在说了,我们要检查每个页面程序,几十万行代码重新过一遍,最起码要 3-5 天,然后再全功能测试,再修 bug ,再测,2 周都很紧张,要天天加班。

    领导:不行,最多 3 天。

    李工:要尊重科学啊,工作量这么大,不可能完成啊。要么,换成子域名不改路径,今天就能上线。

    领导:子路径和子域名有什么差别啊?叫网管部的小张过来

    小张:子路径和子域名没啥区别,我 dns 配置一下,几分钟搞定。

    领导:…

    (大多数 web 系统在开发前就没规划自定义路径,开发后要自定义路径,修改工作量大,之后基本都是不了了之)
    DesnLee
        20
    DesnLee  
       1 天前
    @maninnet #3 那得前端项目做相应的配置,不是纯代理部分能解决的
    dode
        21
    dode  
       1 天前
    建议二选一修改路径,不好改的直接使用 sub.abc.com ,好改的使用 sub.abc.com/alist
    zxabition
        22
    zxabition  
       1 天前
    让提供域名的人将 *.sub.abc.com 解析到你的机器,你再加一层子域名不就行了。。。

    alist.sub.abc.com 指向 alist

    nas.sub.abc.com 指向 nas



    题外话:推荐使用 zoraxy 。nginx porxy manager 的 aems.sh 我用着有些问题,证书申请不下来,zoraxy 没啥问题。

    另外,zoraxy 资源占用还小一些。
    slowhand
        23
    slowhand  
       1 天前
    location ^~ /api {
    proxy_pass http://127.0.0.1:8085;
    proxy_set_header Host $host;

    查了下自己的配置,不知道这个$host 改了有没有效?
    akabk
        24
    akabk  
       1 天前
    不知道你是怎么查的,至少 AList 的官方文档有说明。

    将 site_url 设置为 https://nn.ci/alist 或者仅/alist, 然后重启 alist
    location /alist/ {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:5244/alist/;
    # the max size of file to upload
    client_max_body_size 20000m;
    }
    maninnet
        25
    maninnet  
    OP
       1 天前 via iPhone
    感谢各位解答,我在尝试的时候就意识到需要后端配合了,所以用了 sub_filter 做了部分替换,但是没有办法根本解决。
    @zxabition 用 3 级域名的话配合 nginx 可以实现吗?
    likai
        26
    likai  
       1 天前
    proxy_pass 转发
    zxabition
        27
    zxabition  
       1 天前
    可以的,nginx proxy manager 本质上也就是个 nginx+自动配置,

    我用三级域名+nginx proxy manager 实现过,不同域名跳转不通页面。

    例如 hz.xxxx.xx *.hz.xxxx.xx 解析成同一个 ip ,然后 qbit.hz.xxxx.xx 配置反代理的 qbit 。pbh.hz.xxxx.xx 反代的 peerbanhelper ,都能正常使用(当时我用的 nginx porxy manager )
    lao66
        28
    lao66  
       1 天前 via iPhone
    加端口号不行?
    maninnet
        29
    maninnet  
    OP
       1 天前 via iPhone
    @zxabition 那是需要配置一个*.sub.abc.com 的 ip 指向我的机器,后面 3 级域名的命名都在 nginx 配置就可以了吧?
    maninnet
        30
    maninnet  
    OP
       1 天前 via iPhone
    @lao66 可以,但是这个域名是备案过的,端口也不好寄
    maninnet
        31
    maninnet  
    OP
       1 天前 via iPhone
    @akabk 没有看过文档…我试一下,不过还是没有解决跟其他服务共存的问题。
    zxabition
        32
    zxabition  
       1 天前
    @maninnet 是的。

    https://img.picui.cn/free/2024/12/03/674e7c3e4679a.png

    不会上传图,凑合着看吧
    cpstar
        33
    cpstar  
       1 天前
    少用路径反代,如果下游系统用了绝对地址,那就是恶心他妈给恶心开门。
    shalingye
        34
    shalingye  
       1 天前
    最近做过,放弃吧,设置多个子域名对应不同服务,js 或者 python 随便写的服务没办法走域名路径的
    iorilu
        35
    iorilu  
       1 天前
    那就用三级域名阿, 有什么区别吗

    都是给开发人员用的, 又不是让用户用
    shalingye
        36
    shalingye  
       1 天前
    一个域名而已,值多少钱?自己用的买个 6 块的 xyz ,时间宝贵杜绝浪费
    qfchannel
        37
    qfchannel  
       1 天前
    nas alist……随便找个免费的垃圾域名挂了不就完了,这么折腾干啥,自用也想那么讲究为啥不直接买个自己的域名
    pkoukk
        38
    pkoukk  
       1 天前
    用不同的端口就行,本身家宽开 80 和 443 就是作死行为
    sub.abc.com:5000 -> NAS
    sub.abc.com:5244 -> ALIST
    azc1NDk5OTgwMA
        39
    azc1NDk5OTgwMA  
       1 天前
    之前搞反代的时候上网找了资料,如果是前后端路径写死的话得用 location + rewrite ,但是反代的一多就乱起来了,最后还是用了 subdomain
    TomCN
        40
    TomCN  
       1 天前
    我之前用笔记本装过一个飞牛 OS(后面性能不够就没使用了),想过一个方案,使用 Cookie 来标记当前访问的站点,然后每次根据 Cookie 来判断

    server {
    listen 80;
    server_name example.com;

    # 处理 /a 和 /b ,设置 Cookie 并重定向到 /
    location = /a {
    add_header Set-Cookie "current-site=a; Path=/; HttpOnly; Max-Age=3600";
    return 302 /;
    }

    location = /b {
    add_header Set-Cookie "current-site=b; Path=/; HttpOnly";
    return 302 /;
    }

    # 处理 /
    location / {
    # 根据 Cookie 值选择代理目标
    if ($http_cookie ~* "current-site=a") {
    proxy_pass http://localhost:3000/;
    break;
    }

    if ($http_cookie ~* "current-site=b") {
    proxy_pass http://localhost:4000/;
    break;
    }

    # 如果没有 Cookie ,返回 404
    return 404;
    }
    }


    不知道是否可行,不过有一定的副作用,比如不能 a 和 b 同时在一个浏览器中访问,每次访问另一个站点需要先使用路径切换一下,两个站点的路径不能起冲突
    dfdd1811
        41
    dfdd1811  
       1 天前
    我记得之前我捣鼓 list 的时候也想这样,但是他软件不支持再加后缀。很多软件都需要支持才行。所以我现在起服务要么就直接用端口访问,非要洁癖,就单开个二级域名,申请新证书,反正也是自动续期
    phenixc
        42
    phenixc  
       1 天前
    nas 和 alist 使用端口访问,sub.abc.com 指向 lucky666 所在服务器,使用 lucky666 的 web 反向代理让 sub.abc.com/alist 指向 alist 服务所在地址和端口应该可以解决。不过我更偏向于使用 alist.sub.abc.com
    lovelylain
        43
    lovelylain  
       1 天前 via Android
    子路径就这样,要么服务本身支持子路径,要么 sub_filter 替换,为什么会有 sub_filter 这么麻烦的方式,因为没有更好的办法,你都替换了一半而且看到效果了,继续换吧,或者查查服务有没有提供编译或者配置选项支持子路径。
    xuanbg
        44
    xuanbg  
       1 天前
    只有一个二级域名的话,你应该一开始就该规划好子目录,然后再写代码。不然你怎么配置 nginx 都会有一些无解的问题。
    Tink
        45
    Tink  
       1 天前
    nginx
    zwgf
        46
    zwgf  
       1 天前
    用端口
    zuotun
        47
    zuotun  
       1 天前
    只能再买几个域名或者用端口号区分,你这样做工作量巨大而且很容易出问题。不是大家没有这种需求,而是子域名又不要多花钱,何必做成 All in one 呢?
    当然也有解决方案,配合一些奇技淫巧完全可以实现访问同一个网址展示完全不同的页面,但这样搞你肯定是不打算给其他人用了,这样一来还不如改端口号来的方便实在。
    InDom
        48
    InDom  
       1 天前
    给一个笨笨的方案,但这个方案可能不能做到同时访问。

    使用 service worker 技术,拦截 fetch 请求。

    fetch 请求增加一个 header 头,指引 nginx 反向代理到哪个服务。

    比如你打开 sub.exmaple.com/nas 后 worker 中记录下当前要访问 nas ,然后跳转回 sub.exmaple.com ,worker 中的 fetch 请求时就带上 nas 的标记,nginx 收到请求后只反向代理到 nas 后端。
    duanxianze
        49
    duanxianze  
       1 天前
    不同的端口反向代理啊
    skyadmin
        50
    skyadmin  
       1 天前
    买个域名几十块的事情,买个自己独有的,干啥都方便
    starck
        51
    starck  
       1 天前
    能不能给个*.sub 的记录
    hatsuyuki
        52
    hatsuyuki  
       1 天前
    https://freedns.afraid.org/subdomain/

    这个网站最多免费提供 5 个二级域名
    realpg
        53
    realpg  
       1 天前
    什么做互联网项目的公司?竟然没有几个十年已备案域名储备?
    dream10201
        54
    dream10201  
       1 天前
    买个域名吧,首年几块钱
    jslang
        55
    jslang  
       1 天前
    akabk 是正解,我这边 alist 可以给你参考

    nginx.conf
    location /alist/ {
    proxy_pass http://localhost:5244;
    }

    docker-compose.yml
    alist:
    container_name: alist
    environment:
    TZ: Asia/Shanghai
    SITE_URL: https://s.fyi/alist
    image: xhofe/alist:latest
    ports:
    - 5244:5244
    cominghome
        56
    cominghome  
       1 天前
    用目录转发首先得你的应用支持,最简单的例子,你的静态资源得使用相对路径而非绝对路径。用不同端口能接受吗?
    z7356995
        57
    z7356995  
       1 天前
    6 位数字域名.xyz 一美元一年我买了 10 年也不过 80 元,时间珍贵,能用钱解决,不要浪费时间
    sagaxu
        58
    sagaxu  
       1 天前
    首次访问 sub.abc.com/xxx 时,把实际路径 xxx 写入 Cookie ,后续请求根据 Cookie 重写路径
    ala2008
        59
    ala2008  
       1 天前
    这不是很常见的 nginx 配置吗,转发或重定向
    PeiXyJ
        60
    PeiXyJ  
       1 天前
    最烦的就是 前端的页面指向就是 /static/xxxx.jpg 用 nginx 代理基本无效.
    SenLief
        61
    SenLief  
       1 天前
    最简单的办法是让域名提供的把二级域名让你自己托管。
    SenLief
        62
    SenLief  
       1 天前
    @ala2008 前端不适配,把静态文件路由写死了
    ala2008
        63
    ala2008  
       1 天前
    @SenLief 也有这种情况,弄个子域名吧
    HangoX
        64
    HangoX  
       1 天前
    简单一点?如果只是自己用,修改本地的 host 文件,想要啥域名就要啥域名
    qwq11
        65
    qwq11  
       1 天前   ❤️ 1
    用 Referer 判断就行,我用的 Caddy

    @alist header Referer https://your.domain.com/alist*
    handle @alist {
    uri strip_prefix /alist
    reverse_proxy 127.0.0.1:5244 {
    @redir status 301 302 308
    handle_response @redir {
    header >Location "(.*)" "/alist$1"

    copy_response
    }
    }
    }
    charce
        66
    charce  
       23 小时 32 分钟前
    1 、用不同的端口是最直接的;
    2 、如果要用 subfolder 记忆网址的话,是不是可以用 url 跳转;(我就自己部署了 YOURLS 用来跳转)
    gjnevergo
        67
    gjnevergo  
       23 小时 7 分钟前
    简单点 就是子域名 在二级域名配 DNS A record 直接解析请求过去
    lizhq
        68
    lizhq  
       21 小时 40 分钟前   ❤️ 1
    nginx 代理一下就可以了吧

    ps: 来我给你开一些二级域名给你用
    nextvay
        69
    nextvay  
       19 小时 32 分钟前
    感觉你是 js 文件有问题,xx/alist 访问首页,里面 js 可能是 xx/js ,自己玩的话,可以考虑油猴写个脚本,把所有的 js 增加个前缀
    duhbbx1119
        70
    duhbbx1119  
       18 小时 49 分钟前
    配代理就可以了吧,没看出来难点在哪儿?
    之前搞 to G 的项目,花式配 nginx,现在不行了
    angryfish
        71
    angryfish  
       18 小时 18 分钟前
    楼上说的都太复杂了。关键词是 NS 记录。
    1.比如你的腾讯云 dns ,你朋友用的阿里云 dns 。
    2.你可以在腾讯 dns 里创建子域名 sub.abc.com ,后面直接按腾讯云提示操作就行了。
    你朋友只需两步:配置一个 txt 记录用于腾讯云验证你有这个三级域名权限,一条 sub.abc.com 指向你的腾讯域名 ns 服务
    这样,你就可以在腾讯云自由创建无限个四级域名了。
    512357301
        72
    512357301  
       16 小时 20 分钟前 via Android
    alist 是支持路径反代的参数好像叫 site_url ,具体看文档去。
    你说的 nas 应该是说 nas 首页吧,首页其实没必要反代,直接访问就行,如果/被占用了,必须反代的话,得先看看 nas 首页支持不支持
    smarthing
        73
    smarthing  
       5 小时 45 分钟前 via Android
    alist 可以按照这个文档配置 https://alist.nn.ci/faq/howto.html#how-to-reverse-proxy-with-sub-directory

    关于用域名还是路径来区分不同 HTTP 服务的问题,优选域名最简单,但是那种通配符证书只适用于一级子域名,二级子域名不生效。

    另外,只要 HTTP 服务不把路径写成绝对路径,比如引用的文件用 ./xx.js 而不用 /xx.js ,基本问题不大。
    smarthing
        74
    smarthing  
       5 小时 43 分钟前 via Android
    在这里顺便吐槽一下 tplink 路由器管理界面,狗日的资源文件引用地址是 ../web/xx.js
    Laysan
        75
    Laysan  
       1 小时 11 分钟前
    给你个参考
    ronyin
        76
    ronyin  
       47 分钟前
    为啥不能再买个域名。。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5483 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 07:55 · PVG 15:55 · LAX 23:55 · JFK 02:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.