如何用django http重定向做一个简单的强制门户?

时间:2013-07-16 05:00:39

标签: django redirect iptables

我有一台运行django的设备并提供无线接入点。我本质上想创建一个各种网址,其中输入的任何网址都会转到我的django网页。

到目前为止,我已经创建了一个类似于iptables的规则(现在):

iptables -t nat -A PREROUTING -d 0/0 -p tcp –dport 80 -j DNAT –to 192.168.50.1:8000 

这在某种程度上有效,只是如果我转到例如“google.com”,我会在浏览器网址中显示google.com,但会显示我的django网页。

我希望mydjangowebpage.com能够在网址中显示。似乎有许多强制门户解决方案需要dns服务器,多个iptables规则,radius服务器等。

对我而言,似乎一个简单的解决方案是执行我在上面指定的一个规则,然后在django中执行一些httpredirect命令。我想知道我的urls.py调度员是否能够检查实际的网站网址(即“google.com”部分),如果不是“mydjangowebpage.com”则将httpredirect设置为“mydjangowebpage”。那有意义吗?

我猜urlpatterns会查找匹配项,似乎要完成此操作,模式需要查找NOT匹配项并查看整个url,而不仅仅是站点名称后面的内容。

例如,类似于:

urlpatterns = patterns('',
    url(lambda x: not models.get_current_site(request) == 'mydjangowebpage.com', lambda x: HttpResponseRedirect("http://mydjangowebpage.com")),
    ....

1 个答案:

答案 0 :(得分:2)

我找到了办法。如果有更好的方法,我仍会保持开放状态......

您可以使用中间件过滤器。我发现这个here可以工作(称为hostname_middleware.py)。为方便起见,我在这里复制了它:

from django.conf import settings
from django.utils.http import urlquote
from django import http

class EnforceHostnameMiddleware(object):
    """
    Enforce the hostname per the ENFORCE_HOSTNAME setting in the project's settings
    The ENFORCE_HOSTNAME can either be a single host or a list of acceptable hosts
    """
    def process_request(self, request):
        try:
            if not settings.ENFORCE_HOSTNAME:
                return None
        except AttributeError, e:
            return None

        host = request.get_host()

        # find the allowed host name(s)
        allowed_hosts = settings.ENFORCE_HOSTNAME
        if not isinstance(allowed_hosts, list):
            allowed_hosts = [allowed_hosts]
        if host in allowed_hosts:
            return None

        # redirect to the proper host name
        new_url = [allowed_hosts[0], request.path]
        new_url = "%s://%s%s" % (
            request.is_secure() and 'https' or 'http',
            new_url[0], urlquote(new_url[1]))
        if request.GET:
            new_url += '?' + request.META['QUERY_STRING']

        return http.HttpResponsePermanentRedirect(new_url)

然后添加您的settings.py文件(自定义以满足您的需求):

ENFORCE_HOSTNAME=['192.168.50.1','mydjangowebpage.com']

将中间件添加到MIDDLEWARE_CLASSES:

'mydjangowebpage.hostname_middleware.EnforceHostnameMiddleware'

现在,当我转到网址“facebook.com”或其他任何内容时,它会将名称重定向到列表中的第一个名称。好极了!轻松俘虏门户网站!