Eu tenho o Django rodando atrás do Nginx. Um dos domínios serve arquivos de imagem, seja de um cache no sistema de arquivos local, se tal arquivo existir, ou com um script django, se não.
Para esconder o nome real dos bots, às vezes quero embaralhar os caracteres nos nomes dos arquivos. Nesse caso, o URL tem um prefixo "/ x /". Aqui está minha tentativa na configuração do 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;
}
}
Tudo funciona se a regra de reescrita não for correspondida. Se a regra de reescrita for correspondida, ela só funcionará quando o arquivo puder ser encontrado no sistema de arquivos. O Django sempre retorna 404. Em sua página de erro de depuração, o django diz que "mydomain.com/abc123.gif" não pode ser encontrado, onde o URL é o reescrito corretamente. Se eu copiar e colar o URL na barra de endereços do navegador e tentar carregá-lo, ele funcionará. O Django não chama a função especificada em urls.py, nem sequer diz nada sobre o urls.py na página de erro.
Por quê? Como a requisição passada para o Django após uma reescrita é diferente de uma regular?