美文网首页
7. Django --- 两个域名访问使用同一个django项

7. Django --- 两个域名访问使用同一个django项

作者: HelloJames | 来源:发表于2018-01-06 20:18 被阅读552次

实际使用中遇到一个使用场景是这样的, 两个域名, 如: www.aaa.comwww.bbb.com, nginx配置一个upstream服务器(假设为: ** http://127.0.0.1:9001 **)来接受这个两个域名转发过来的请求.要求实现:

  • 访问www.aaa.com, 请求转至http://127.0.0.1:9001/, 访问www.aaa.com/demo, 请求转至http://127.0.0.1:9001/demo/.以此类推.
  • 访问www.bbb.com, 请求转至http://127.0.0.1:9001/bbb/, 访问www.bbb.com/bbb/demo/, 请求转至http://127.0.0.1:9001/bbb/demo/.以此类推.

方法一: 通过配置nginx来实现

分析:
www.aaa.com的请求转发规则很好配置, 关键在于www.bbb.com的配置. 也就是说, 需要将请求的地址进行rewrite.
唯一需要做的就是, 将www.bbb.com请求转发至 http://127.0.0.1:9001/bbb/其他的都可以不用改动.
因此, 再来配置就简单多了.

server {
        listen          80;
        server_name     www.bbb.com;

        rewrite ^/$ /bbb/ break;   # 添加一个rewrite规则即可

        location /static {
            alias /var/www/mysite/static;
            access_log off;
            expires 7d;
            add_header Pragma public;
            add_header Cache-Control "public";
        }

        location /media {
            alias /var/www/mysite/media;
            access_log off;
        }

        location / {
           proxy_set_header Host $host:$server_port;
           proxy_pass http://127.0.0.1:9090/;
           include /etc/nginx/uwsgi_params;
        }

    }
server {
        listen          80;
        server_name     www.aaa.com;


        location /static {
            alias /var/www/mysite/static;
            access_log off;
            expires 7d;
            add_header Pragma public;
            add_header Cache-Control "public";
        }

        location /media {
            alias /var/www/mysite/media;
            access_log off;
        }

        location / {
           proxy_set_header Host $host:$server_port;
           proxy_pass http://127.0.0.1:9090/;
           include /etc/nginx/uwsgi_params;
        }

    }

在nginx中使用rewrite时需要注意:
** server区块中如果有包含rewrite规则, 则会最先执行, 而且只会执行一次, 然后再判断命中哪个location区块, 再去执行该location中的rewrite.**

通过nginx来实现固然可以, 但不是最好的, 修改起来也麻烦. 推荐使用第二种.

方法二: 通过配置django中间件来完成.

首先得说一下实验的环境:
client <-> nginx <-> uwsgi <-> django_project
上面的流程就是我当前部署的django项目的环境.

要想通过django中间件来完成多域名使用同一个django项目, 首先, 需要确保nginx配置当中有添加此项:
proxy_set_header Host $host:$server_port;

余下的就是开始编写中间件了.

编写MultipleDomainMiddleware中间件

在settings.py所在目录下, 新建一个文件middlewares.py, 并添加以下内容:

from django.utils.deprecation import MiddlewareMixin
from django.conf import settings


class MultipleDomainMiddleware(MiddlewareMixin):

    def process_request(self, request):
        host = request.get_host()
        url_config = getattr(settings, 'MULTIPLE_UFL_CONFIG', None)

        if url_config:
            for key in url_config.keys():
                if key in host:
                    request.urlconf = url_config[key]

settings.py中修改一些配置

MIDDLEWARE = [
    'mysite.middlewares.MultipleDomainMiddleware',
    ...
]
ALLOW_HOSTS = ['127.0.0.1', 'www.aaa.com', 'aaa.com', 'www.bbb.com', 'bbb.com']
MULTIPLE_UFL_CONFIG = {
    'aaa.com': 'mysite.urls',
    'bbb.com': 'mysite.urls_bbbb',
}
ROOT_URLCONF = 'mysite.urls'

添加相应的urls.py文件

同时在根urls.py文件所在目录新增一个文件urls_bbb.py.两个文件的内容可能如下:
** urls.py **

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
import aaa.views

urlpatterns = [
    url(r'^', include("aaa.urls", namespace="aaa")),
    url(r'^admin/', admin.site.urls),
]

** urls_bbb.py **

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.views.static import serve
import bbb.views

urlpatterns = [
    url(r'^', include("bbb.urls", namespace="bbb")),
    url(r'^admin/', admin.site.urls),
]

至此, 即可实现同一个django项目, 使用多个域名访问不同路径了.

结束语

行文匆匆, 文中要是有什么不正确的地方, 欢迎指正!

相关文章

网友评论

      本文标题:7. Django --- 两个域名访问使用同一个django项

      本文链接:https://www.haomeiwen.com/subject/dahenxtx.html