Перезапись URL в Django 1.3 - PullRequest
3 голосов
/ 29 июня 2011

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

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

"Это правильное поведение?" Нет, это не так. За 4 года Djangoing я никогда не видел этой конкретной проблемы.

Один из способов проверки того, что CommonMiddleware вызывает это, - закомментировать его в файле settings.py, перезапустить, а затем проверить, действуете ли вы так же. Также может быть полезно использовать автономный сервер разработки и вставлять print в интересные места, чтобы узнать, кто его искажает.

0 голосов
/ 29 июня 2011

Проверьте ваши URL. Скорее всего, вы немного неправильно определили свой URL. Если у вас есть

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

вместо правильного

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

Вы увидите этот тип 404 с промежуточным ПО

...