django - 如何使用 django http 重定向创建一个简单的强制门户?

标签 django redirect iptables

我有一个运行 django 并提供无线接入点的设备。我本质上想创建一个强制门户,其中输入的任何 url 都会转到我的 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 调度程序是否能够检查实际的站点 url(即“google.com”部分),以及它是否不是“mydjangowebpage.com”来执行 httpredirect 到“mydjangowebpage”。那有意义吗?

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

例如,类似以下内容:

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

最佳答案

好吧,我找到了一种方法。如果有更好的方法,我仍然会保留它......

您可以使用中间件过滤器。我找到了这个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”或其他任何内容时,它会将名称重定向到列表中的第一个。耶!简单的强制门户!

关于django - 如何使用 django http 重定向创建一个简单的强制门户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17668364/

相关文章:

django - Django 不适合传达业务逻辑吗?

javascript - 我的 PHP URL 不会重定向

成功时 PHP 页面重定向,否则显示错误

c - BPF : mark in structure __skbuff is not writeable?

linux - 阻止 VM 特定端口上的所有流量

linux - 为什么 Capistrano 在执行特定 iptables 命令时会锁定?

python - 是否可以将 django 的 GEOSGeometry 作为独立产品使用

python - 如何向 Django 站点中的匿名用户发送 session 消息?

javascript - 使用javascript重定向html页面

mysql - django.db.backends.dummy 和 django.db.backends.mysql 有什么区别?