django:使用ip地址而不是域名

时间:2017-01-22 14:25:36

标签: python django

Django网站在负载均衡器后面运行,它通过在/ health /上使用实例的IP地址而不是域名发出HTTP GET请求来执行运行状况检查。

如果缺少,我会使用PREPEND_WWW将www添加到域名。

但PREPEND_WWW也将www添加到IP地址,这显然是错误的。例如http://www.123.123.123.123/health/

有没有办法阻止为IP地址添加www,或者只有在正则表达式列表匹配时才添加www?

或者我应该避免使用PREPEND_WWW并使用自定义视图/重定向手动实现重定向?

请注意我也使用SECURE_SSL_REDIRECT = True,以防万一也会对www重定向产生影响。

为了将来参考,我在Ubuntu上使用Apache和mod_wsgi,所以我的“服务器级别”解决方案是使用mod_rewrite。

# Edit vhost configuration
sudo vi /etc/apache2/sites-enabled/000-default.conf

# Add redirection to VirtualHost block
<VirtualHost *:80>
    ...
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^domain.com$
    RewriteRule (.*) https://www.domain.com$1 [R=301,L]
    ...

# Enable mod_rewrite and restart
sudo a2enmod rewrite && sudo service apache2 restart

1 个答案:

答案 0 :(得分:1)

一般来说,PREPEND_WWW是一个较少使用的设置,因为它是错误的 - 它无法正常用于主机名别名,IP地址甚至localhost。 这是Django上的一个已知问题,看起来不会修复。 以下是relevant ticket

的详细信息

与@makaveli一样,nginx或您可能正在使用的任何其他Web服务器代理都是进行重定向的正确位置。

但是,如果您必须在代码中执行此操作,则以下是一种方法: 您可以做的一件事是,编写自己的custom middleware which is derived from CommonMiddleware来覆盖process_request

例如,

must_prepend = settings.PREPEND_WWW and host and not host.startswith('www.')
    redirect_url = ('%s://www.%s' % (request.scheme, host)) if must_prepend else ''

可能是(伪代码)

must_prepend = False
ip_address_regex = ....
if settings.PREPEND_WWW:
    must_prepend =  host and not re.match(ip_address_regex, host) and not host.startswith('www.')
redirect_url = ('%s://www.%s' % (request.scheme, host)) if must_prepend else ''

当然,这需要经过充分测试,随着CommonMiddleware实施的更改,您有责任更新此中间件。