.png)
Estoy buscando una solución paraeste problema. Entiendo el motivo por el cual la configuración en esa pregunta no funciona, pero trato de encontrar una solución donde pueda hacerla funcionar.
La idea es permitir la carga de archivos grandes sólo en determinadas URL. Puedo usar un location
bloque para esto, pero el problema es: tengo un patrón de controlador frontal de PHP:
location ~ \.php {
# ...
fastcgi_pass unix:/tmp/php5-fpm.sock;
}
Mi configuración total se ve así:
# ...
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;
}
}
}
Según tengo entendido, solo se aplicará un bloqueo de ubicación. Entonces, si tengo un tamaño de solicitud predeterminado de 512K, los 256M nunca se aplicarán ya que todas las solicitudes coinciden a través del patrón frontcontroller ~ \.php
.
¿Estoy en lo cierto en este caso? Si es así, ¿qué se puede configurar para que los visitantes no puedan cargar nada excepto cuando lo hacen en admin/upload
?
Respuesta1
Si /admin/upload
la ruta es virtual, es posible hacer que funcione de la siguiente manera:
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;
}
Tampoco es el más bonito, pero funciona.
Respuesta2
¿Definir dos ubicaciones de 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;
}
Quizás no sea el más bonito... Aunque debería ser funcional...
Respuesta3
Es posible utilizar varias ubicaciones, pero es un poco complicado.
Si usa try_files
o rewrite
como se explicó anteriormente, entonces se client_max_body_size
establecerá en client_max_body_size
el contexto superior, no en el del bloque de ubicación que esperaría.
Mueva su configuración PHP FastCGI a un archivo que pueda incluir, como php-conf.conf
.
Luego use dicha configuración:
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;
}
Tenga en cuenta que debe sobrescribir SCRIPT_FILENAME
para usarlo index.php
si tiene un nombre de script diferente configurado. Esto podría suceder debido a fastcgi_split_path_info ^(.+\.php)(/.*)$;
.