w3schools superglobales method ejemplo _request php request

php - superglobales - Obtener datos de entrada sin procesar



request post php (3)

No implementé esto completamente, pero parece que debería funcionar. En Apache conf :

SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2 RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE

Establecer el tipo de Content-Type para application/x-httpd-php parece resolver el problema original de PHP para analizar el cuerpo, y el problema que Norbert Farkas informó: "Apache envía de vuelta el código fuente de PHP" . El cuerpo está entonces disponible en php://input , y el tipo de contenido real en el encabezado X-Real-Content-Type . (Es posible que ese encabezado no sea necesario para usted; la variable MULTIPART_CTYPE no parecía aparecer en mi $_ENV , pero sí el nuevo encabezado). Todas las demás solicitudes se deben manejar como de costumbre.

¡Gracias a Anti Veeranna por la mayor parte! :)

EDITAR: PD Obviamente es específico de Apache, pero en algunas de las otras configuraciones de PHP puede haber formas mucho más sencillas.

De acuerdo con php manual y php: // input, ni $HTTP_RAW_POST_DATA funcionan con multipart/form-data POST-requests.

La entrada "php: //" le permite leer datos POST sin formato. Es una alternativa que requiere menos memoria que $HTTP_RAW_POST_DATA y no necesita ninguna directiva php.ini especial. php: // la entrada no está disponible con enctype="multipart/form-data" ."

¿Cómo puedo obtener datos sin multipart/form-data para formularios de multipart/form-data formulario?



Respuesta directa: no puedes hacer eso. PHP insiste en analizarlo él mismo, siempre que vea el tipo de contenido multipart / form-data. Los datos brutos no estarán disponibles para usted. Tristemente. Pero puedes hackearlo.

Me encontré con un problema similar, un socio estaba enviando datos formateados incorrectamente como multipart / form-data, PHP no podía analizarlo y no lo estaba distribuyendo para que yo pudiera analizarlo.

¿La solución? Agregué esto a mi conf de apache:

<Location "/backend/XXX.php"> SetEnvIf Content-Type ^(multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2 RequestHeader set Content-Type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE </Location>

Esto cambiará el tipo de contenido de la solicitud entrante a XXX.php de multipart / form-data a multipart / form-data-alternate, que es suficiente para bloquear PHP e intentar analizarlo

Después de esto, finalmente puede leer todos los datos brutos de la entrada php: // y analizarlos usted mismo.

Es feo, pero no he encontrado una solución mejor o, de hecho, ninguna otra, salvo pedirle al compañero que solucione su problema.

¡NÓTESE BIEN! Cuando hagas lo que describí aquí, $ _FILES estará vacío.