如何在nginx中组合rewrite和client_max_body_size?

时间:2016-03-26 17:04:26

标签: nginx

我想将大文件上传到一个位置,然后将该位置重写到另一个位置。似乎重写正在重置其他配置。

我的配置:

server {
    listen 80;

    server_name example.com;
    root /var/www;
    index index.php;

    # this location requires large file upload
    location /upload {
        client_max_body_size 512M;
        rewrite ^(.*)$ /index.php?request=$1 last;
    }

    # all other locations
    location / {
        rewrite ^(.*)$ /index.php?request=$1 last;
    }

    # pass the PHP scripts to FPM
    location ~ \.php$ {
        include /etc/nginx/includes/php;
    }
}

如果我将client_max_body_size从location移出server,那么它就可以了。

如果我将它放在location /uploadlocation ~ \.php$中,那么它也可以。但我不希望其他地方能够上传大文件。

我原以为我可以直接在location /upload中直接使用PHP,但是一旦我运行重写,它就会寻找另一个位置。这是否意味着我必须有两个单独的PHP脚本位置?有没有办法让client_max_body_size在重写后通过其他位置保留?

1 个答案:

答案 0 :(得分:0)

如果您需要特定的client_max_body_size,则需要在处理最终URI的location内设置(或继承)。在您的情况下,即location ~ \.php$

正如您在问题中指出的那样,最简单的解决方案是在location /upload中处理PHP文件。这很容易实现,因为您已经将PHP配置放在单独的包含文件中。

rewrite ... break;或覆盖两个fastcgi_param指令应该适合您:

选项1:

location /upload {
    client_max_body_size 512M;

    rewrite ^(.*)$ /index.php?request=$1 break;

    include /etc/nginx/includes/php;
}

有关详细信息,请参阅this document

选项2:

location /upload {
    client_max_body_size 512M;

    include /etc/nginx/includes/php;

    fastcgi_param QUERY_STRING    request=$uri&$query_string;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
}