Django具有CommonMiddleware設置,默認情況下會向不以一個結尾的URL添加斜槓。Django 1.3 URL重寫
例如: (1)如果在URLconf中檢測到/ admin /存在,則將http://www.example.com/admin重寫爲(2)http://www.example.com/admin/。 (3)http://www.example.com//admin/這給我一個404錯誤。但是,我得到的情況,而不是(2),我得到(3)http://www.example.com//admin/這給我一個404錯誤。
這是正確的行爲?什麼是解決404錯誤的一種方法? 非常感謝。
注: 我在Django 1.3 + nginx + gunicorn上運行。 我試過用Django 1.3 + nginx + apache + mod_wsgi運行,我也得到(3)(所以它不是一個web服務器問題),但我沒有得到404錯誤。
============================================== ========================
UPDATE:
問題是與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;
}
}
您好感謝您的答覆。我忽略了提到我正在運行nginx作爲SSL反向代理。我用沒有nginx的dev服務器運行了一個Django的vanilla實例,問題不會發生。望着它... – quekshuy
請回報你找到的東西。我在幾個網站上使用nginx,並且總是很好地知道要注意的怪異點。 –
這是我的錯誤。感謝您試圖將我指向正確的方向。我會接受你的回答。 – quekshuy