2011-03-14 178 views
0

我有一个子域m.example.com,我想指向与运行在apache2/django1.3安装上的example.com/mobile相同的位置。如何将域名指向Django网址?

example.com是登录页面,我配置了urls.py,以便匹配/^mobile$/的网址将被用于网页的移动版本。我看着<VirtualHost>,但我认为它需要一个物理位置,我指向m.example.com与django网址和除了项目目录的根目录之外没有物理位置。

我不确定配置更改是在apache方还是django方进行的。

我也进去看了mod_rewrite模块的Apache,但我宁愿如果我没有必须m.example.com重定向到example.com/mobile

回答

4

我将避免apache重定向,只使用中间件。

通常使用中间件来获取上下文变量,该上下文变量给出用户正在使用的当前域。

来源:http://djangosnippets.org/snippets/1119/

class SubdomainMiddleware: 
    """ Make the subdomain publicly available to classes """ 

    def process_request(self, request): 
     domain_parts = request.get_host().split('.') 
     if (len(domain_parts) > 2): 
      subdomain = domain_parts[0] 
      if (subdomain.lower() == 'www'): 
       subdomain = None 
      domain = '.'.join(domain_parts[1:]) 
     else: 
      subdomain = None 
      domain = request.get_host() 

     request.subdomain = subdomain 
     request.domain = domain 

对你的看法,可以使用的子域和域值适当地转换内容和逻辑。

def homepage(request): 
    if request.subdomain == 'm': 
     return movil_homepage(request) 
    else: 
     return default_homepage(request) 

你甚至可以得到装饰者,并映射您网站上的所有视图。

更常见的是,它只是建立第二个项目,使用相同的数据库。随你便。

+0

谢谢你指出我在正确的方向。最后,我写了一个重写request.path_info的中间件。我在github上找到了更全面的解决方案:https://github.com/tkaemming/django-subdomains – username2 2011-03-16 04:50:08

1

虽然你可以代理m.example.comexample.com/mobile,这将导致你的reverseurl功能打破。

所以解决这个问题的唯一正确方法是创建一个额外的<VirtualHost>,使用^$为您的移动网址。