nginx 重写破坏了 django?

nginx 重写破坏了 django?

我在 Nginx 后面运行 Django。其中一个域提供图像文件,如果存在这样的文件,则从本地文件系统上的缓存中获取,如果不存在,则使用 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 的请求与常规请求有何不同?

相关内容