为什么Django无法在Varnish代理后面生成CSRF或会话Cookie?

问题描述

| 在具有Apache2的Linux服务器上运行Django 1.2.5,由于某种原因,Django似乎无法存储CSRF或会话cookie。因此,当我尝试登录Django管理员时,提交登录表单后会给我CSRF验证错误。有谁遇到这个问题并找到解决方案? 当我在主机提供的VPS的网址上尝试此帖子时,我可以发表一个有效的帖子。例如:vps123.hostdomain.com/admin/,并为该域设置了cookie。但是,当我访问www.sitedomain.com/admin/并尝试登录时,出现CSRF 403错误提示cookie不存在,并且当我在浏览器中签入cookie时,未设置它们。 我尝试在设置文件中设置以下内容
SESSION_COOKIE_DOMAIN = \'www.sitedomain.com\'
CSRF_COOKIE_DOMAIN = \'www.sitedomain.com\'
还尝试了:
SESSION_COOKIE_DOMAIN = \'vps123.hostdomain.com\'
CSRF_COOKIE_DOMAIN = \'vps123.hostdomain.com\'
我在settings.py的MIDDLEWARE_CLASSES中添加了\'django.middleware.csrf.CsrfViewMiddleware \',并且表单中包含CSRF令牌,该令牌显示在POST中。 我启用了Cookie。我已经在多个浏览器和机器上尝试过此操作。 www.sitedomain.com前面有一个清漆代理服务器,我认为这可能是问题的一部分。任何有使用代理服务器和Django经验的人都可以对此有所了解。 我的apache2配置:
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.sitedomain.com
    ServerAlias www.sitedomain.com
    <Location \"/\">
        Options FollowSymLinks
        SetHandler python-program
        pythoninterpreter nzsite
        PythonHandler django.core.handlers.modpython
        PythonDebug On
        PythonPath \"[\'/var/www/django_projects\',\'/var/www\',\'/usr/lib/python2.6/dist-packages\'] + sys.path\"
        SetEnv DJANGO_SETTINGS_MODULE project_one.settings
    </Location>
    <location \"/PHPmyadmin\">
        SetHandler None
    </location>
</VirtualHost>

<VirtualHost *:80>
    ServerName othersite.sitedomain.com
    ServerAlias othersite.sitedomain.com
    <Location \"/\">
        Options FollowSymLinks
        SetHandler python-program
        pythoninterpreter ausite
        PythonHandler django.core.handlers.modpython
        PythonDebug On
        PythonPath \"[\'/var/www/django_projects\',\'/usr/lib/python2.6/dist-packages\'] + sys.path\"
        SetEnv DJANGO_SETTINGS_MODULE project_two.settings
    </Location>
    <location \"/PHPmyadmin\">
        SetHandler None
    </location>
</VirtualHost>
    

解决方法

问题是我的站点前面有一个Varnish代理服务器。 Varnish正在接受请求并从中剥离Cookie。要解决此问题,我必须让管理Varnish Server的公司将\'/ admin \'添加到例外列表中,以便可以传递cookie。抱歉,我无法进一步了解清漆工艺的工作原理。     ,您是否在表单模板中包含“ 3”?
<form autocomplete=\"off\" method=\"post\" action=\"{% url auth_login %}\">{% csrf_token %}
    {{form|as_p}}
    <input type=\'submit\' />
</form>
包括中间件吗?
    \'django.middleware.csrf.CsrfViewMiddleware\',
从您的编辑中推测,这可能与Apache中的VirtualHost配置有关(如果您的提供程序正在使用apache)。这是我其中一个apache配置的编辑版本。
<VirtualHost *:80>
ServerName www.domain.com

WSGIProcessGroup my-django-site
WSGIScriptAlias / /path-to-my-django-site/wsgi/production.wsgi
Alias /media /path-to-my-django-site/media
</VirtualHost> 
可能是因为apache中的服务器名称必须与您在框中单击的域名以及Django配置中的* _COOKIE_DOMAIN设置匹配。我不确定您是否可以更改此设置。如果没有其他答案可以胜出,则可能值得与您的提供者交谈。     ,您要使用csrf信息更新模板数据吗?
from django.core.context_processors import csrf

def index(request)
    data = {\"listitems\": items}
    data.updates(csrf(request))

    return render_to_response(\'template.html\',data)