在域名做了泛解析以后,如何为每个用户都分配一个二级域名? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tornado Documentation
http:/www.v2ex.com/tornado/
Tornado on GitHub
https://github.com/facebook/tornado/
Tornado Gists
http://tornadogists.org/
kenneth
V2EX    Tornado

在域名做了泛解析以后,如何为每个用户都分配一个二级域名?

  •  
  •   kenneth 2012-12-06 14:39:31 +08:00 11139 次点击
    这是一个创建于 4705 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Tornado中如何分发这些请求?
    23 条回复    1970-01-01 08:00:00 +08:00
    robhsiao
        1
    robhsiao  
       2012-12-06 14:53:31 +08:00
    用正则取从HTTP_HOST 取出.
    kenneth
        2
    kenneth  
    OP
       2012-12-06 15:07:07 +08:00
    kenneth
        3
    kenneth  
    OP
       2012-12-06 15:23:23 +08:00
    1000000这样的应该是数据库的一个字段,所以nginx解析的时候,如何处理呢?
    不同于二级域名指向一级目录那种方式。
    kenneth
        5
    kenneth  
    OP
       2012-12-06 15:34:28 +08:00
    @timonwong
    Tornado这里的正则该怎么写呢?
    application = tornado.web.Application([
    (r"/", MainHandler),
    ],**settings)
    timonwong
        6
    timonwong  
       2012-12-06 15:52:48 +08:00
    @kenneth
    不需要管那里的正则
    LazyZhu
        7
    LazyZhu  
       2012-12-06 16:03:08 +08:00
    @kenneth

    nginx中很简单,可以
    server {
    server_name ~^(.+)\.domain\.com$;
    root /path/to/data/$1;
    }
    kenneth
        8
    kenneth  
    OP
       2012-12-06 16:06:25 +08:00
    @timeonwong
    不用正则还有点问题,比如www.42qu.com不能给跳到42qu.com/u/www这样的地方去
    还不得要领,跳的有点乱。
    kenneth
        9
    kenneth  
    OP
       2012-12-06 16:08:12 +08:00
    @LazyZhu
    谢谢你的建议,但是你这样做。是二级域名定位到目录。
    我想很多用户的时候,不会建目录,直接用数据库的一个字段来表示。
    kenneth
        10
    kenneth  
    OP
       2012-12-06 16:14:34 +08:00
    LazyZhu
        11
    LazyZhu  
       2012-12-06 16:14:47 +08:00   1
    @kenneth

    rewrite啊,想怎样就怎样

    server {
    server_name ~^(.+)\.domain\.com$;
    rewrite ^ domain.com/u/$1;
    }
    timonwong
        12
    timonwong  
       2012-12-06 16:29:28 +08:00
    @kenneth
    用nginx估计只能自己写module或者用lua模块写了。
    lua查询一个k/v库,得到id -> user的对应关系,然后redirect
    kenneth
        13
    kenneth  
    OP
       2012-12-06 16:40:18 +08:00
    @livid @LazyZhu @timonwong
    还是不太明白
    http://10000000.42qu.com/
    我的理解,应该是二级域名的
    /根目录的请求
    http://42qu.com/user/10000000
    应该是
    /user/([0-9]+)/来处理请求

    而Tornado中没有区分二级域名的请求
    application = tornado.web.Application([
    (r"/", MainHandler),
    ],**settings

    @felinx这篇博客说这个问题,只是我还没理解。
    http://feilong.me/2012/08/wildcard-subdomain-support-in-tornado
    timonwong
        14
    timonwong  
       2012-12-06 16:50:51 +08:00
    @kenneth
    tornado处理的话
    不需要管那里的正则,该怎么写怎么写
    你只需要判断 request.host 是不是需要跳转的二级域名。
    是的话就302
    不是不管,交给get()/post()继续处理

    最多只是个程序的结构问题,为了避免重复编码,可以做个BaseHandler基类或者MixIn, 在prepare()中,处理就可以了。
    timonwong
        15
    timonwong  
       2012-12-06 16:54:37 +08:00
    @kenneth
    你贴的那个博客方法看来更好,有哪点无法理解啊?
    kenneth
        16
    kenneth  
    OP
       2012-12-06 17:01:46 +08:00
    等我想想怎么说清楚,我自己再试试先。
    LazyZhu
        17
    LazyZhu  
       2012-12-06 17:28:13 +08:00
    写了个简单的示例,看看是不是你要的

    server {
    server_name ~^(.+)\.byvee\.com$;
    set $subdomain $1;
    location / {
    rewrite_by_lua '
    ngx.ctx.user = ngx.var.subdomain
    if ngx.ctx.user == "1" then
    ngx.ctx.user = lazyzhu
    local url = ngx.ctx.user .. ".byvee.com"
    return ngx.redirect("http://url/", 301)
    end
    ';
    content_by_lua '
    local user = "user:" .. ngx.ctx.user
    ngx.say(user)
    ';
    }

    test:

    1.byvee.com
    2.byvee.com
    .....
    LazyZhu
        18
    LazyZhu  
       2012-12-06 17:30:31 +08:00
    @kenneth

    lua 里面你可以任意扩展的
    kenneth
        19
    kenneth  
    OP
       2012-12-06 18:38:28 +08:00
    @LazyZhu 谢谢你,我不会这种,我用self.request取subdomain,然后判断再跳转的方式实现了。
    暂时先这样,只是不知道这种方法好不好。
    2code
        20
    2code  
       2012-12-06 18:42:00 +08:00
    LS,我想你们想复杂了,我曾经在一个php的实际项目中使用的这样的泛域名的方式。

    我当时的方法是:

    ngnix里:
    server_name site.com *.site.com;

    php里(我当时使用了一个类似于express的微框架)
    写一个middleware,对所有访问过来的请求进行过滤,使用正则判断到泛域名的子域名部分,放在SESSION中,所有不同的子域名访问请求执行的其实是同一套代码,只是SESSION中有一个变量让所有的代码能区分对待不同的用户。
    LazyZhu
        21
    LazyZhu  
       2012-12-06 19:02:51 +08:00
    @kenneth 可行就好,至于这种方法好不好,在生产中检验下吧。

    @2code 能在webserver层解决的问题不要放在后面的应用层。
    2code
        22
    2code  
       2012-12-06 19:26:19 +08:00
    @LazyZhu web server 级别上要解决这个问题,纯属简单问题复杂化!
    felinx
        23
    felinx  
       2012-12-07 10:35:33 +08:00
    呃,我的那条博客已经讲得很清楚了,你在仔细看看,还有poweredsites的源码吧!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2525 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:12 PVG 20:12 LAX 05:12 JFK 08:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86