Django имеет настройку CommonMiddleware, которая по умолчанию добавляет косую черту к 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;
}
}