每个位置块的 Nginx client_max_body_size(使用 php 前端控制器模式)

Jur*_*man 12 nginx upload

我正在寻找解决此问题的方法。我理解该问题中的设置不起作用的原因,但我尝试找到一个可以使其正常工作的解决方案。

这个想法是只允许在某些 url 上上传大文件。我可以location为此使用一个块,但问题是:我有一个 php 前端控制器模式:

location ~ \.php {
    # ...
    fastcgi_pass unix:/tmp/php5-fpm.sock;
}
Run Code Online (Sandbox Code Playgroud)

我的总配置如下:

# ...

http {
    # ...

    client_max_body_size 512K;

    server {
        server_name example.com;
        root        /var/www/example.com/public;

        location / { 
            try_files $uri /index.php?$query_string;
        }

        location /admin/upload {
            client_max_body_size 256M;
        }

        location ~ \.php {
            # ...

            fastcgi_pass unix:/tmp/php5-fpm.sock;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,只会应用一个位置块。因此,如果我的默认请求大小为 512K,则永远不会应用 256M,因为所有请求都通过 frontcontroller 模式匹配~ \.php

在这种情况下我是否正确,如果是这样,可以配置什么使访问者无法上传任何内容,除非他们上传到admin/upload

小智 5

如果/admin/upload路径是虚拟的,则可以使其工作如下:

location / {
    try_files $uri /index.php?$args;
}

location /admin/upload {
    client_max_body_size 256M;

    include inc/php.conf;
    rewrite ^(.*)$ /index.php?$args break;
}

location ~ \.php$ {
    include inc/php.conf;
}
Run Code Online (Sandbox Code Playgroud)

也不是最漂亮的,但有效。


Dan*_*ick 3

定义两个php位置?

location ~ ^/admin/upload/.+\.php$
{
    client_max_body_size 256M;
    include /etc/nginx/conf.d/php-fpm.conf;
}   
location ~ \.php
{
    include /etc/nginx/conf.d/php-fpm.conf;
}
Run Code Online (Sandbox Code Playgroud)

也许不是最漂亮的...但应该是实用的..