2012-08-01 6 views
7

Actualmente estoy trabajando en un sitio web donde los usuarios pueden cargar archivos. ¿Cómo puedo evitar que se carguen archivos de gran tamaño? En ese momento, ninguna opción (PHP post_max_size y upload_max_filesize) ha sido útil: el archivo se carga por completo. Simplemente me gustaría que la conexión se cierre con archivos demasiado grandes (al marcar Content-Length encabezado HTTP de antemano, y verificando mientras el archivo se está cargando). ¿Hay una directiva Apache o una clave de configuración de PHP para esto?Cerrar la conexión de Apache con cargas de archivos demasiado grandes

¡Gracias por su tiempo!

EDITAR: agregado Apache conf (valor predeterminado de CentOS).
EDIT2: se agregó PHP conf (valor predeterminado de CentOS) también.

EDIT3: Parece que PHP cierra el conducto cuando se le da un archivo demasiado grande. Sin embargo, Apache aún permite la transferencia hasta que finaliza.

+0

http://stackoverflow.com/questions/4738691/php-bulk-post-500-apache-internal-server-error/4739476#4739476, compruebe los parámetros de esa respuesta – regilero

+0

Hemos intentado todos estos, excepto por el tiempo -relacionados: no queremos ser dependientes de la velocidad de la conexión. De todos modos, PHP parece no ser el problema, es más bien de Apache. – Iso

+0

Como se indica en el enlace y en la respuesta de @PhpMyCoder tiene LimitRequestBody en la configuración de Apache. – regilero

Respuesta

2

Ok.

lo tanto, el principal problema que se enfrentan es que directiva de Apache LimitRequestBody o LimitXMLRequestBody se aplica después de la finalización de la carga. Parece que apache está esperando un archivo completo en una carpeta temporal antes de verificar el tamaño.

Así que debe reducir la conexión inmediatamente después de la detección de cargas demasiado grandes. Uno a la vez mod_throttle era un módulo disponible para hacer eso. Verificando esto Alternative to mod_throttle servfault question puede tener una lista de módulos de control de ancho de banda que se ajusten a sus necesidades.

mod_bwshare por ejemplo es capaz de limitar el ancho de banda por IP del cliente, pero eso no es un límite de por solicitud y por IP. También existe el mod_quos, que maneja muchas limitaciones para descargar cosas, pero no puedo encontrar muchas cosas para la administración de carga (solo puede cerrarse la carga lenta temprana). Vea también this answer on throttling uploads.

Por lo que también puede comprobar si hay nivel de sistema operativo limitación (en la pila TCP) o firewall avanzado capacidades (preguntar en servfault).

También puede usar herramientas de limitación del lado del cliente, como valores de formulario ocultos o configuraciones de carga js, pero como todo lo utilizado en el lado del cliente, en términos de seguridad no puede evitar que alguien altere las limitaciones del lado del cliente.

2

Puede usar apache's LimitRequestBody. La sintaxis es simple (y en bytes):

LimitRequestBody 10490000 # 10 MB 

Esto funciona tanto en httpd.conf y .htaccess, acaba de ser conscientes de reiniciar si edita httpd.conf (sudo service apache2 restart en Ubuntu).

Si es necesario establecer restricciones en función de cada archivo (límite avatar Subir a 5 MB, pero los archivos adjuntos límite a 20 MB), puede utilizar <Files>:

<Files avatarUpload.php> 
    LimitRequestBody 5242880 # 5 MB 
</Files> 

<Files attachmentUpload.php> 
    LimitRequestBody 20971520 # 20 MB 
</Files> 
+2

Probamos esto también; lamentablemente, el archivo está completamente cargado y Apache elimina la conexión después. – Iso

+0

¿De verdad? A continuación, debe registrar un informe de error con Apache: esto contradice explícitamente el objetivo de esta funcionalidad (es decir, dudo mucho de su metodología) – symcbean

+0

Good One .... :) – Baba

Cuestiones relacionadas