美文网首页
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