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 · 10547 次点击
    这是一个创建于 4148 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   我们的愿景   ·   实用小工具   ·   6072 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:18 · PVG 14:18 · LAX 23:18 · JFK 02:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.