Django 1.3 URL重写

时间:2011-06-28 22:45:34

标签: django nginx gunicorn

Django有CommonMiddleware设置,默认情况下会为不以1结尾的网址添加斜杠。

例如: (1)http://www.example.com/admin如果在URLconf中检测到/ admin /存在,则重写为(2)http://www.example.com/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 /”。这意味着最终的网址为https://www.example.com//admin/

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

检查您的网址。您很可能已经错误地定义了您的URL。如果你有

(r'^admin', include(admin.site.urls))

而不是正确的

(r'^admin/', include(admin.site.urls)),

您将看到这种类型的404与中间件