【发布时间】:2011-03-28 13:40:18
【问题描述】:
我有一个由(比如)example.com 提供的 Django 应用程序。它包含许多子应用程序(比如)strength、speed 和skill。 URL 方案类似于http://example.com/strength、http://example.com/speed 和http://example.com/skill。这就是我运行我的开发服务器的方式(使用runserver)并且没有任何问题。
现在,在部署期间,我需要将子域映射到这些子应用程序。更具体地说,我希望http://x.example.com 映射到http://example.com/x(对于x 的上述值),然后可以继续处理。
我用谷歌搜索了一下,发现了两种方法。
- 一种是获取一些中间件来获取 URL 的子域部分,并将其保存在传递给我的视图方法的
request对象中。然后我在我的应用程序逻辑中完成整个事情。 - 另一种是使用Apache
mod_rewrite做上面的URL翻译,然后让我的应用程序照常运行。
我选择了后者,因为它看起来更整洁,而且我认为我不必在我的核心应用程序中包含特定于部署的代码。
现在,我被一个无法真正解决的问题所困扰。在skill 应用程序中,我有一个名为skill_home 的网址。这是http://example.com/skill。但是,一旦我部署,skill_home URL 将变为http://skill.example.com/skill。 Django 将/skill 附加到顶级域,这就是我得到的。如果我在此 URL 上执行 GET,mod_rewrite 将其更改为 http://skill.example.com/skill/skill,但它不起作用。
我的mod_rewritesn-ps 长这样
RewriteCond %{HTTP_HOST} !www.example.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www.)?skill.example.com [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /skill/$1
如何巧妙地解决这个问题?
【问题讨论】:
-
拥有一个通用的
mod_rewrite定义来处理将您的子域映射到您的子应用程序路径并不难,但只要 Django 将这些路径附加到您的 URL,就不可能解决问题.我个人只熟悉这个问题的mod_rewrite方面,但是有没有办法阻止 Django 附加该路径? (嗯,我想这确实是你问题的一部分,但我想我会问) -
好吧,我想实际上将每个
sub-application作为单独的顶级应用程序运行,然后将它们从/中服务。不过看起来太重了。
标签: python django mod-rewrite subdomain