【发布时间】: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;
}
}
【问题讨论】: