¿Puedo establecer globalmente $ _SERVER ['REDIRECT_URL'] antes de la ejecución del script?

8

Estoy en el proceso de migrar muchos sitios de una configuración de servidor antigua a una nueva. Cada sitio se basa en una base de código similar (pero lamentablemente no idéntica), utilizando URL mod_rewrite.

  • Ubuntu 8.04 LTS => Ubuntu 12.04 LTS
  • Apache 2.22.8 => Apache 2.2.22
  • PHP 5.2 (FastCGI) => PHP 5.3 (PHP5-FPM)

Principalmente funciona como un encanto, pero en la nueva configuración, $ _SERVER ['REDIRECT_URL'] ya no está configurado y el código falla debido a la dependencia de esta variable global.

Por lo que entiendo, Apache establece esta variable cuando se produce una redirección. Obviamente esto no está sucediendo ahora, pero estoy luchando por encontrar la causa.

  • ¿Es la actualización de Apache o (supongo) el cambio de PHP FastCGI a PHP5-FPM?
  • ¿Cómo recupero esta variable?

Realmente prefiero no tener que editar el código en cada sitio, por lo que estableceré un auto_prepend PHP global si es necesario, pero idealmente me gustaría arreglar la configuración del servidor y tener esto configurado en primer lugar.

Potencialmente relacionado: ahora también tengo un par de nuevas variables $ _SERVER, a saber, REDIRECT_SCRIPT_URL y REDIRECT_REDIRECT_SCRIPT_URL. Estos parecen tener los datos correctos que quiero para REDIRECT_URL, pero también parecen indicar que se están produciendo dos redireccionamientos internos que no existían antes: Google busca REDIRECT_REDIRECT_SCRIPT_URL solo devuelve salidas aleatorias de var_dump. ¿SCRIPT_URL es el nuevo REDIRECT_URL?

Editar 1

Verificando nuevamente REDIRECT_URL está (ahora) configurado, pero siempre en 'index.php' (el objetivo mod_rewrite) en lugar de la URL escrita esperada. He recurrido a usar PHP auto_prepend_file para configurar manualmente la variable necesaria.

No estoy seguro de cómo me lo perdí la primera vez, pero he hecho varios cambios mientras tanto, así que supongo que hay una posibilidad externa de que no estuviera allí. Disculpas si esto engaña a alguien.

Editar 2

Para abordar las menciones de ErrorDocument a continuación, la regla mod_rewrite en uso es:

RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]

La variable $ _GET ['url'] está establecida, por lo que la regla debe estar funcionando.

Para ser claros, en esta etapa he seguido con la solución de auto_prepend_file que mencioné inicialmente.

Barry
fuente
-1 por no mostrar la debida diligencia. Una búsqueda rápida en Google no sustituye la lectura de la documentación. Antes de actualizar los sistemas o el código, debe asegurarse de comprender lo que ha cambiado, al menos en lo que afecta a sus sistemas o proyectos.
John Gardeniers
Disculpas por no ser claro; Leí la documentación lo mejor que pude ver. Luego recurrí a Google cuando me topé con algo que no podía explicar. La configuración está en una máquina separada, y durante las pruebas previas al movimiento descubrí el problema anterior. Sin embargo, he encontrado un error que cometí, así que voy a actualizar la pregunta.
Barry
es realmente en su interés y el nuestro mejor si nos dice estas cosas por adelantado. He revocado mi voto.
John Gardeniers
¿Puede darnos más información sobre la configuración del servidor anterior y nueva? Creo que la configuración de REDIRECT_URL en PHP proviene de la variable de entorno SCRIPT_URL en apache, pero hay muchas cosas que pueden modificar el comportamiento de esa importación (por ejemplo, suPHP, motores de envoltura, sentencias AddTypeHandler, etc.).
Jon Kloske

Respuestas:

3

REDIRECT_URL solo lo establece el servidor web Apache, y solo en determinadas circunstancias . Probablemente no sea algo en lo que deba confiar su código. Por lo que puedo decir, la mejor solución sería arreglar el código PHP defectuoso; realmente no puede forzar que esto se configure siempre en Apache.

Michael Hampton
fuente
Gracias por la respuesta, aunque desafortunadamente no pude ver nada en ese enlace relacionado con mi problema. No creo que haya un ErrorDocument externo involucrado en esto. Desearía poder cambiar el código existente, pero esa no es una opción en este momento.
Barry
El punto es que REDIRECT_URL solo se establece durante el procesamiento de ErrorDocument. Eso significa que sus scripts PHP se cargaron como ErrorDocuments en la configuración original, y quien los escribió confió en este comportamiento. Ahora que no está sucediendo, los guiones se rompen.
Michael Hampton
No hay definiciones de ErrorDocument en uso, y no puedo ver cómo la mod_rewrite RewriteRule (agregada anteriormente) involucra una. No estoy dialogando con usted acerca de que REDIRECT_URL no está garantizado, simplemente no puedo encontrar ninguna documentación relevante sobre por qué.
Barry
Lo relacioné arriba en mi respuesta. Si necesita algo más, tendrá que leer el código fuente de Apache. De todos modos, recuerde aceptar la respuesta que resolvió su problema haciendo clic en el contorno de la marca de verificación al lado y bienvenido a Server Fault.
Michael Hampton
0

De acuerdo con la documentación de PHP:

$ _SERVER es una matriz que contiene información como encabezados, rutas y ubicaciones de script. Las entradas en esta matriz son creadas por el servidor web. No hay garantía de que cada servidor web proporcione ninguno de estos; los servidores pueden omitir algunos o proporcionar otros que no figuran aquí. Dicho esto, una gran cantidad de estas variables se tienen en cuenta en la especificación »CGI / 1.1 , por lo que debería poder esperarlas.

Por lo tanto, parece que no todas $_SERVERlas variables superglobales son tan independientes de la plataforma como cabría esperar. $_SERVER['REQUEST_URI']parece ser uno de esos valores que se define de manera consistente por todos los principales servidores web, por lo que es posible que desee intentar usarlo en su lugar.

Garrett
fuente
Gracias por esto, pero ya sabía que a veces esto está configurado, y otras no. Lo que esperaba era una forma de influir activamente en las variables que se configuran para mi configuración particular, ya que no puedo encontrar ninguna documentación sobre detalles basados ​​en mi configuración (es decir, cómo sabría antes de la construcción de un entorno).
Barry
0

Para las imágenes faltantes en uno de nuestros proyectos que fueron redirigidos al index.php, solo utilicé esta solución:

url: http://www.domanXY.de/image.php?file=var/binaries/store/8dfaadde-5309-4a35-8f9a-d8b9cd807aae.jpg&options=&options=resize_outer(320,150);sharpen(64) ;

<?php
//image.php (newly created)
$_SERVER['REDIRECT_URL'] = "image.php";
include "index.php";

Si desea una solución global, creo que debe usar explotar (), etc. y usar otra variable dada como $ _SERVER ['REQUEST_URI'].

Software Fusca
fuente
-1

Puede configurar un archivo php auto-prepend para incluir un pequeño fragmento de código PHP que establezca esta variable.

Jon Kloske
fuente
En mi pregunta ya identifiqué esto como el curso de acción que tomaría si no fuera posible. También fue lo que terminé haciendo, según la edición que hice antes de que respondieras.
Barry
Disculpas, no recuerdo haber visto la edición antes de publicar; puede haber sido que comencé a responder antes de que hicieras la edición, pero no puedo estar seguro ya que la edición posterior ha eliminado el sello de fecha de edición original: / También debería haber dejado más claro que lo que estaba sugiriendo es probablemente la forma correcta de lograr lo que buscas, en lugar de un "respaldo". Puede usar las banderas [E: blah = blah] en las reglas de reescritura para establecer variables de entorno arbitrarias para luego buscar dentro del archivo preincluido que es más limpio que usar variables GET para pasar cosas del motor de redireccionamiento a su código.
Jon Kloske
Y por "probablemente correcto", quiero decir que así es como he hecho esto exactamente en varios lugares en el pasado.
Jon Kloske