Nginx client_max_body_size на блок местоположения (с шаблоном php frontcontroller)

Nginx client_max_body_size на блок местоположения (с шаблоном php frontcontroller)

Я ищу решение дляЭта проблемаЯ понимаю, почему настройка в этом вопросе не работает, но я пытаюсь найти решение, при котором она заработает.

Идея в том, чтобы разрешить загрузку больших файлов только на определенные URL. Я могу использовать locationблок для этого, но проблема в следующем: у меня есть шаблон php frontcontroller:

location ~ \.php {
    # ...
    fastcgi_pass unix:/tmp/php5-fpm.sock;
}

Мой общий конфиг выглядит так:

# ...

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;
        }
    }
}

Насколько я понимаю, будет применен только один блок location. Так что если у меня размер запроса по умолчанию 512K, 256M никогда не будут применены, поскольку все запросы сопоставляются через шаблон frontcontroller ~ \.php.

Прав ли я в этом случае, и если да, то что можно настроить так, чтобы посетители не могли ничего загружать, кроме как когда они загружают в admin/upload?

решение1

Если /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;
}

Не самый красивый, но работает.

решение2

Определить два расположения 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;
}

Возможно, не самый красивый... Хотя должен быть функциональным..

решение3

Использование нескольких местоположений возможно, но это немного сложно.

Если вы используете try_filesили , rewriteкак описано выше, то client_max_body_sizeбудет установлено значение client_max_body_sizeболее высокого контекста, а не того, который соответствует блоку местоположения, как вы ожидаете.

Переместите конфигурацию PHP FastCGI в файл, который вы можете включить, например php-conf.conf.

Тогда используйте такую ​​конфигурацию:

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$query_string;
    }

    location ~ ^/admin/upload$ {
        client_max_body_size 4m;
        include /etc/nginx/php-conf.conf;
        fastcgi_param SCRIPT_FILENAME $realpath_root/index.php;
    }

    location ~ ^/index\.php(/|$) {
        include /etc/nginx/php-conf.conf;
        internal;
    }

Обратите внимание, что вам нужно перезаписать, SCRIPT_FILENAMEчтобы использовать index.php, если у вас установлено другое имя скрипта. Это могло произойти из-за fastcgi_split_path_info ^(.+\.php)(/.*)$;.

Связанный контент