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


8

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

Идея состоит в том, чтобы разрешить загрузку больших файлов только по определенным 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;
        }
    }
}

Как я понимаю, будет применен только один блок местоположения. Поэтому, если у меня размер запроса по умолчанию 512 КБ, 256 М никогда не будут применены, поскольку все запросы сопоставляются с помощью шаблона frontcontroller ~ \.php.

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

Ответы:


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

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


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

Не самая красивая тоже, но работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.