python - 为什么 Django 不在 Varnish 代理后面生成 CSRF 或 session Cookie?

标签 python django csrf varnish

在装有 Apache2 的 Linux 服务器上运行 Django 1.2.5,出于某种原因,Django 似乎无法存储 CSRF 或 session cookie。因此,当我尝试登录到 Django 管理员时,它在提交登录表单时给我一个 CSRF 验证错误。有没有人反对这个并找到解决方案?

当我在我的主机提供的我的 VPS 的 url 上尝试这个时,我能够发布一个有效的帖子。示例: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 token ,它显示在 POST 中。

我启用了 cookie。我已经在多个浏览器和机器上试过了。

www.sitedomain.com 前面有一个 varnish 代理服务器,我认为这可能是问题的一部分。任何有使用代理服务器和 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>

最佳答案

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

关于python - 为什么 Django 不在 Varnish 代理后面生成 CSRF 或 session Cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6065503/

相关文章:

jquery - django:csrf_token用于单个页面上的多个表单和ajax请求

python - Django 使用序列化器在 Restframework 中进行 API 调用的一对多关系

python - Django 教程 : name 'HttpResponse' is not defined

java - 用于 Java 的 Unirest

python - 将 float 输入列表而不覆盖列表

django - 重复键值在保存 ModelForm 时违反了唯一约束

spring-mvc - 无法使用 Spring Security 创建 CSRF token

c# - Spring Boot、Freemarker、MVC 单元测试、Csrf

python - Http 错误 : 400 Missing Required Parameter while using jobs. query() BQ API

python - 在django.shortcuts.render和django.views.generic.TemplateView之间选择