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

2012-12-06 14:39:31 +08:00
 kenneth
Tornado中如何分发这些请求?
10760 次点击
所在节点    Tornado
23 条回复
robhsiao
2012-12-06 14:53:31 +08:00
用正则取从HTTP_HOST 取出.
kenneth
2012-12-06 15:07:07 +08:00
kenneth
2012-12-06 15:23:23 +08:00
1000000这样的应该是数据库的一个字段,所以nginx解析的时候,如何处理呢?
不同于二级域名指向一级目录那种方式。
timonwong
2012-12-06 15:29:43 +08:00
kenneth
2012-12-06 15:34:28 +08:00
@timonwong
Tornado这里的正则该怎么写呢?
application = tornado.web.Application([
(r"/", MainHandler),
],**settings)
timonwong
2012-12-06 15:52:48 +08:00
@kenneth
不需要管那里的正则
LazyZhu
2012-12-06 16:03:08 +08:00
@kenneth

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

rewrite啊,想怎样就怎样

server {
server_name ~^(.+)\.domain\.com$;
rewrite ^ domain.com/u/$1;
}
timonwong
2012-12-06 16:29:28 +08:00
@kenneth
用nginx估计只能自己写module或者用lua模块写了。
lua查询一个k/v库,得到id -> user的对应关系,然后redirect
kenneth
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
2012-12-06 16:50:51 +08:00
@kenneth
tornado处理的话
不需要管那里的正则,该怎么写怎么写
你只需要判断 request.host 是不是需要跳转的二级域名。
是的话就302
不是不管,交给get()/post()继续处理

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

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

我当时的方法是:

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

php里(我当时使用了一个类似于express的微框架)
写一个middleware,对所有访问过来的请求进行过滤,使用正则判断到泛域名的子域名部分,放在SESSION中,所有不同的子域名访问请求执行的其实是同一套代码,只是SESSION中有一个变量让所有的代码能区分对待不同的用户。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/54233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX