【问题标题】:Django 1.3 URL rewritingDjango 1.3 URL 重写
【发布时间】:2011-09-24 17:33:49
【问题描述】:

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;
    }   
}

【问题讨论】:

    标签: django nginx gunicorn


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回复。我没有提到我将 nginx 作为 SSL 反向代理运行。我在没有 nginx 的情况下使用开发服务器运行了一个 Django 的 vanilla 实例,并且没有出现问题。调查它...
    • 请报告您的发现。我在几个网站上使用 nginx,知道要注意的怪事总是很高兴。
    • 这是我的错误。感谢您试图为我指明正确的方向。我会接受你的回答。
    【解决方案2】:

    检查您的网址。您很可能定义了您的 URL 有点不正确。如果你有

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

    而不是正确的

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

    你会看到这种类型的 404 和中间件

    【讨论】:

    • 您好,感谢您的回复。我已经检查过了。这是正确的版本。
    猜你喜欢
    • 2019-11-26
    • 2016-07-05
    • 2015-08-16
    • 2020-01-20
    • 2013-01-17
    • 2017-06-15
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多