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?
Puede establecer enable_post_data_reading = Off
y PHP no interceptará datos multipart/form-data
data.
Requiere: PHP 5.4
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.