5

我的项目需要有多个子域。每个子域代表一些公司。例如:company1.myproject.io、company2.myproject.io。我使用django-hosts库来设置子域。

主机文件:

127.0.0.1       localhost
127.0.0.1       myproject.io
127.0.0.1       www.myproject.io
127.0.0.1       company1.myproject.io
127.0.0.1       company2.myproject.io

设置.py:

ROOT_URLCONF = 'core.urls'
ROOT_HOSTCONF = 'core.hosts'
DEFAULT_HOST = 'www'
DEFAULT_REDIRECT_URL = "http://www.myproject.io:8000"

核心/hosts.py:

from hostsconf import urls as redirect_urls
host_patterns = [
    host(r'www', settings.ROOT_URLCONF, name='www'),
    host(r'(?!www).*', redirect_urls, name='wildcard'),
]

主机配置/urls.py:

from .views import wildcard_redirect

urlpatterns = [
    url(r'^(?P<path>.*)', wildcard_redirect)
]

主机配置/views.py:

DEFAULT_REDIRECT_URL = getattr(settings, "DEFAULT_REDIRECT_URL", "http://www.myproject.io:8000")

def wildcard_redirect(request, path=None):
    new_url = DEFAULT_REDIRECT_URL
    if path is not None:
        new_url = DEFAULT_REDIRECT_URL + "/" + path
    return HttpResponseRedirect(new_url)

我现在有几个问题:

  1. 当我转到 myproject.io 时,它成功地将我重定向到 www.myproject.io。但是当我去Invalid HTTP_HOST header: 'company1.myproject.io:8000'. You may need to add u'company1.myproject.io' to ALLOWED_HOSTS company1.myproject.io 时,当我得到新的子域或者我做错了什么时,我真的需要每次都将新主机添加到 ALLOWED_HOSTS 吗?
  2. 如何为每个公司的动态上下文的所有子域实现单个视图。基本上我需要通过子域名对数据库进行查询。例子:

    def home_page(request):
        subdomain = 'somehow get sub domain (company1 or company2)'
        comp = User.objects.get(domain_name=subdomain)
        return redirect(request, 'tpl.html', {"company": comp})
    

更新:想出了如何处理 ALLOWED_HOSTS 并获得子域。但我仍然不知道如何为我的子域实现单一视图。我需要在 hosts.py 中创建另一个模式吗?

4

2 回答 2

9

以句点开头的值可用作子域通配符:“.example.com”将匹配 example.com、www.example.com 和 example.com 的任何其他子域。 https://docs.djangoproject.com/en/1.11/ref/settings/#allowed-hosts

出于安全目的,您必须将您的域添加到 allowed_hosts 列表。只需像这样使用通配符:

ALLOWED_HOSTS = ['.myproject.io']

2) 尝试 HttpRequest.META["HTTP_HOST"]

https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.META

或 request.get_host()

更新:如果你想在单个 django 应用程序中操作多个站点,你应该使用Django Sites 框架。你不需要 django-hosts 库。

于 2017-11-08T11:07:24.383 回答
0

这个问题似乎已经过时了,但我认为这对仍在寻找这个问题的任何人都有帮助。

对于通配符子域,在列表中添加域对我不起作用。我必须将其添加为元组。

ALLOWED_HOSTS = ['.domain.com'] - This does not work for me

ALLOWED_HOSTS = ('.domain.com',) - This works for me. 

我在 Django 2.2.5 和 Django 3.6 上对其进行了测试

于 2022-02-12T14:26:10.847 回答