Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用django http重定向实现简单的捕获门户?_Django_Redirect_Iptables - Fatal编程技术网

如何使用django http重定向实现简单的捕获门户?

如何使用django http重定向实现简单的捕获门户?,django,redirect,iptables,Django,Redirect,Iptables,我有一个设备运行django并提供无线接入点。我基本上希望创建一个捕获式门户,在这里输入的任何url都会进入我的django网页 为了实现这一点,我已经创建了一个iptables规则,如下所示(目前): 这在某种程度上是有效的,除了如果我进入例如“google.com”,我会在浏览器url中显示google.com,但我的django网页会显示出来 我希望Mydjangowebage.com能显示在url中。似乎有许多捕获门户解决方案需要dns服务器、多个iptables规则、radius服务器

我有一个设备运行django并提供无线接入点。我基本上希望创建一个捕获式门户,在这里输入的任何url都会进入我的django网页

为了实现这一点,我已经创建了一个iptables规则,如下所示(目前):

这在某种程度上是有效的,除了如果我进入例如“google.com”,我会在浏览器url中显示google.com,但我的django网页会显示出来

我希望Mydjangowebage.com能显示在url中。似乎有许多捕获门户解决方案需要dns服务器、多个iptables规则、radius服务器等

对我来说,一个简单的解决方案似乎是执行我上面指定的一个规则,然后在django中执行一些httpredirect命令。我想知道我的url.py调度程序是否能够检查实际的站点url(即“google.com”部分),如果不是“mydjangwebpage.com”,则可以对“mydjangwebpage”执行httpredirect。这有意义吗

我猜urlpatterns会查找匹配项,似乎要实现这一点,模式需要查找不匹配项并查看整个url,而不仅仅是站点名称后的内容

例如,以下内容:

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

我找到了一个方法。我还是会把它打开的,以防有更好的方法

您可以使用中间件过滤器。我发现这个可以工作(称为hostname\u 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文件(自定义以满足您的需要):

并将中间件添加到中间件类:

'mydjangowebpage.hostname_middleware.EnforceHostnameMiddleware'
现在,当我转到一个url“facebook.com”或其他任何东西时,它会将名称重定向到列表中的第一个。耶!轻松捕获门户

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