uwsgi X-Sendfile仿真mimetype缺失?

时间:2016-05-03 09:07:23

标签: python mime-types uwsgi x-sendfile

我正在为我们的python web应用程序配置uwsgi + nginx。 我想添加 X-Sendfile 仿真(参见http://uwsgi-docs.readthedocs.io/en/latest/Snippets.html):

[uwsgi]
collect-header = X-Sendfile X_SENDFILE
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE}

现在我访问我们的网站,使用 sendfile()正确回复内容。唯一的缺陷是 Content-Type 缺失,即使我已经在wsgi的响应中明确设置了它。我已经尝试了很多方法,我发现的唯一解决方法是:

[uwsgi]

collect-header = X-Sendfile-Content-Type X_SENDFILE_CONTENT_TYPE
collect-header = X-Sendfile X_SENDFILE
response-route-if-not= empty:${X_SENDFILE_CONTENT_TYPE} addheader:Content-Type: ${X_SENDFILE_CONTENT_TYPE} 
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE}

这可行,但有点傻。我真的希望内容类型可以通过文件的扩展名来确定。有可能吗?

1 个答案:

答案 0 :(得分:1)

在深入了解uwsgi的源代码后,我找到了原因(参见 https://github.com/unbit/uwsgi/blob/2.0.12/core/uwsgi.c#L2677

    if (uwsgi.build_mime_dict) {
        if (!uwsgi.mime_file)
#ifdef __APPLE__
            uwsgi_string_new_list(&uwsgi.mime_file, "/etc/apache2/mime.types");
#else
            uwsgi_string_new_list(&uwsgi.mime_file, "/etc/mime.types");
#endif
        struct uwsgi_string_list *umd = uwsgi.mime_file;
        while (umd) {
            if (!access(umd->value, R_OK)) {
                uwsgi_build_mime_dict(umd->value);
            }
            else {
                uwsgi_log("!!! no %s file found !!!\n", umd->value);
            }
            umd = umd->next;
        }
    }
只有在设置变量build_mime_dict时,uwsgi才会构建mime dict(将文件扩展名映射到内容类型)。由于我的配置不包含任何设置此varabile的选项,因此mime dict将为空。

因此,为它添加一些'static'选项(如mimefile)将构建mime dict。同时将collect-header更改为pull-header以确保未显示真实文件路径。

[uwsgi]
mimefile = /etc/mime.types
pull-header = X-Sendfile X_SENDFILE
response-route-if-not = empty:${X_SENDFILE} static:${X_SENDFILE}