Django 1.3 URL重写

标签 django nginx gunicorn

Django 有 CommonMiddleware 设置,默认情况下会在不以 1 结尾的 URL 上附加一个斜杠。

例如: (1) http://www.example.com/admin重写为 (2) http://www.example.com/admin/如果它在 URLconf 中检测到/admin/存在。

但是,我得到的不是 (2),而是 (3) http://www.example.com//admin/这给了我一个 404 错误。

这是正确的行为吗?解决 404 错误的一种方法是什么? 非常感谢。

注意: 我在 Django 1.3 + nginx + gunicorn 上运行。 我试过使用 Django 1.3 + nginx + apache + mod_wsgi 运行,我也得到了 (3)(所以这不是网络服务器问题)但我没有收到 404 错误。

============================================= =======================

更新:

问题出在 nginx 配置上,我编写它是为了将 HTTP 请求重定向到 HTTPS。 以下是报错的nginx配置示例:

upstream django {
    server 127.0.0.1:8000;
}

server {
    listen  80; 
    server_name www.example.com;

    location / { 
        rewrite (.*) https://www.example.com/$1 permanent;
    }   
}

server {
    listen       443;
    server_name  www.example.com;

    ssl                  on;
    ssl_certificate      /home/user/certs/example.com.chained.crt;
    ssl_certificate_key  /home/user/certs/example.com.key;
    ssl_prefer_server_ciphers on;

    ssl_session_timeout  5m;

    location ~ ^/static/(.*)$ {
        alias /home/user/deploy/static/$1;
        access_log off;
        expires max;
    }

    location / {
        try_files $uri $uri/ @django_proxy;
    }

    location @django_proxy {
        proxy_pass          http://django;
        proxy_redirect      off;    
        proxy_set_header    Host                 $host;          
        proxy_set_header    X-Real-IP            $remote_addr;   
        proxy_set_header    X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Protocol    https;  
    }
}

发生的事情是 CommonMiddleware 从 https://www.example.com/admin 重定向。到 http://www.example.com/admin/。这再次命中 nginx,并且按照配置文件中指定的方式将 URL 重写为 https://www.example.com/。 $1 其中 $1 是“/admin/”。这意味着最终 URL 是 https://www.example.com//admin/ .

为了纠正这个问题,我将重写规则更改为:

server {
    listen  80; 
    server_name www.example.com;

    location / { 
        rewrite /(.*) https://www.example.com/$1 permanent;
    }   
}

最佳答案

“这是正确的行为吗?”不,这不对。在 Djangoing 的 4 年中,我从未见过这个特殊问题。

测试 CommonMiddleware 是否导致此问题的一种方法是在您的 settings.py 文件中将其注释掉,重新启动,然后查看是否出现相同的行为。使用独立开发服务器并将 print 粘贴在有趣的地方以查看谁在破坏它也很有启发意义。

关于Django 1.3 URL重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513965/

相关文章:

django - 热重用 Django admin 的表头排序功能?

django - 将 Django 应用程序移植到 GAE 仍然是一种选择吗?

django - 使用 Nginx 限制 Django 管理员登录以防止字典攻击

nginx - Cloudflare CDN和NGINX之间的区别

ruby-on-rails - 捆绑安装 - Ubuntu 上的 Rails

python - nginx - 从上游读取响应 header 时上游发送了太大的 header

python - sagemaker 批量转换在读取上游时中断上游过早关闭的连接

python - django websocket在循环中异步发送消息

python - django 的 request.META.get ('wsgi.url_scheme' ) 返回 http 而不是 https

python - 如何使用 Gunicorn 和 Varnish 运行 Flask?