.png)
Я ищу решение дляЭта проблемаЯ понимаю, почему настройка в этом вопросе не работает, но я пытаюсь найти решение, при котором она заработает.
Идея в том, чтобы разрешить загрузку больших файлов только на определенные 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)(/.*)$;
.