Назад | Перейти на главную страницу

nginx rewrite ломает django?

У меня Django работает за Nginx. Один из доменов обслуживает файлы изображений либо из кеша в локальной файловой системе, если такой файл существует, либо с помощью сценария django, если нет.

Чтобы скрыть настоящее имя файла от ботов, я иногда хочу перетасовать символы в именах файлов. В этом случае URL-адрес имеет префикс «/ x /». Вот моя попытка конфигурации nginx:

server {
listen   80;
server_name  mydomain.com;

client_max_body_size 5M;

access_log  /var/log/nginx/mydomain.access.log;

location /robots.txt {
    root /srv/www/mydomain.com;
}


rewrite ^/x/(.)(.)(.)(.)(.)(.)(.*)$ $5$2$6$3$1$4.jpg last;


location ~* ^.+\.(jpeg|gif|png|jpg|webp) {
    root /srv/imagecache;
    try_files /$uri @aws;
}

location @aws {

    fastcgi_pass unix:/srv/django/myapp/myapp.sock;
        fastcgi_param SERVER_NAME $server_name;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_PROTOCOL $server_protocol;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_param REMOTE_ADDR $remote_addr;
        fastcgi_pass_header Authorization;
        fastcgi_intercept_errors off;

}
}

Все работает, если не соблюдается правило перезаписи. Если правило перезаписи соблюдено, оно работает только в том случае, если файл можно найти в файловой системе. Django всегда возвращает 404. На странице с ошибкой отладки django сообщает, что "mydomain.com/abc123.gif" не может быть найден, где URL-адрес является правильно переписанным. Если я скопирую URL-адрес в адресную строку браузера и попытаюсь загрузить его, все заработает. Django не вызывает функцию, указанную в urls.py, он даже ничего не говорит о urls.py на странице ошибки.

Зачем? Чем запрос, передаваемый в Django после перезаписи, отличается от обычного?