Django具有CommonMiddleware设置,默认情况下会在不以1结尾的URL后面加上斜杠.
例如:
(1)如果在URLconf中检测到/ admin /存在,则将http://www.example.com/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 /”.这意味着最终的URL是https://www.example.com//admin/.
为了解决这个问题,我将重写规则更改为:
server {
listen 80;
server_name www.example.com;
location / {
rewrite /(.*) https://www.example.com/$1 permanent;
}
}
最佳答案
原文链接:https://www.f2er.com/nginx/532204.html