为什么Django不会在Varnish Proxy后面生成CSRF或Session Cookies?

tho*_*len 6 python django csrf varnish

在使用Apache2的Linux服务器上运行Django 1.2.5,由于某种原因,Django似乎无法存储CSRF或Session 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'
Run Code Online (Sandbox Code Playgroud)

还尝试过:

SESSION_COOKIE_DOMAIN = 'vps123.hostdomain.com'
CSRF_COOKIE_DOMAIN = 'vps123.hostdomain.com'
Run Code Online (Sandbox Code Playgroud)

我在settings.py中将"django.middleware.csrf.CsrfViewMiddleware"添加到我的MIDDLEWARE_CLASSES中,表单中有一个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', '/var/www', '/usr/lib/python2.6/dist-packages'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE project_two.settings
    </Location>
    <location "/phpmyadmin">
        SetHandler None
    </location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

tho*_*len 3

问题是我的站点前面有一个 Varnish 代理服务器。Varnish 正在接受请求并从中剥离 cookie。为了解决这个问题,我必须让管理 Varnish 服务器的公司将“/admin”添加到例外列表中,以便可以传递 cookie。抱歉,我无法详细说明 Varnish 流程的工作原理。