У меня 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 после перезаписи, отличается от обычного?