如何让nginx也支持drupal的upload progress

Drupal的Filefield模块原生支持pecl的uploadprogress扩展,但是pecl的uploadprocess只支持apache!

还好nginx也有个upload progress模块,有高手为此写了个对应的drupal模块:FileField Nginx Progress

可惜的是,该模块的配置文档只有寥寥几行字,而drupal官方仅支持apache,关于nginx的文档实在不多,而且权威性有限。我东拼西凑搞了份nginx的配置,用着都没有什么问题,就是upload progress出不了。

考虑到安全性,这里仅贴出一部分配置:

        # Clean URLs rewrite rule
        if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?q=$1  last;
        }

        #nginx uploadprogress
        location ~ (.*)/x-progress-id:(\w*) {
            rewrite ^(.*)/x-progress-id:(\w*)   $1?X-Progress-ID=$2;
        }

        location ^~ /progress {
            report_uploads uploads;
        }

首先查看nginx的error日志,说too large file,原来nginx默认只支持1m的上传大小,需要在http{}里加上

  client_max_body_size           48m;

这里指支持48m的上传文件大小限制。

再查nginx的access日志,/progress返回404,我估计是Clean URLs rewrite的规则出了问题,覆盖了location /progress的虚拟目录设置。于是我把rewrite rule去掉,可uploadgress依然出不来。

最后我打算放弃了,想着顺手把Clean URLs rewrite的规则修改一下,令其支持自定义的location,就算了。于是我在Clean urls rewrite的配置外面前加上location /,因为location /默认的匹配所有url,但其它正则表达式的location优先。这样Clean URLs rewrite规则就不会影响其它自定义location的设定了。

修改后配置如下:

        # Clean URLs rewrite rule
        location / {
                if (!-e $request_filename) {
                        rewrite  ^(.*)$  /index.php?q=$1  last;
                }
        }

        #nginx uploadprogress
        location ~ (.*)/x-progress-id:(\w*) {
            rewrite ^(.*)/x-progress-id:(\w*)   $1?X-Progress-ID=$2;
        }

        location ^~ /progress {
            report_uploads uploads;
        }

修改完成后试了上传,竟发现upload progress的进度出来了,真是激动得眼泪水都快掉下来。原来就差个clean url!

文章分类: 
文章标签: