usar servidor publico para instalar httpd ejecutar configurar conf como archivo acceso php apache apache2 query-string

php - publico - servidor web xampp



¿Cómo se configura Apache/PHP para aceptar barras en las cadenas de consulta? (7)

Tengo dos servidores Apache ejecutando PHP. Uno acepta barras diagonales en la cadena de consulta y la pasa a PHP de la manera esperada, por ejemplo:

http://server/index.php?url=http://foo.bar

funciona y en PHP esta expresión es verdadera:

$_REQUEST[''url''] == "http://foo.bar"

Sin embargo, en el otro servidor Apache, la misma URL da como resultado un error 403 Forbidden . Tenga en cuenta que si la cadena de consulta está escapada de URL correctamente (es decir, con %2F lugar de barra diagonal), todo funciona.

Claramente hay alguna diferencia en la configuración de Apache o PHP que causa esto, ¡pero no puedo entender qué!

Quiero aceptar esta forma de URL en ambos casos, no rechazarla.


Tenga en cuenta que si la cadena de consulta está escapada de URL correctamente (es decir, con% 2F en lugar de barra diagonal), todo funciona.

Por lo tanto, funciona cuando la cadena de consulta está formateada correctamente y no funciona cuando no lo está. ¿Cuál es el problema?


No especifica qué PHP hace con esta url. ¿Redirige a esta página o intenta leerla?

Probablemente exista alguna regla mod_rewrite para eliminar barras diagonales dobles, o para algún otro propósito, que intente redirigir esto a un lugar que no debería.

Tal vez una expresión regular sin ^ antes de http: //


http://server/index.php?url=http://foo.bar no es una URL válida. Tienes que codificar las barras. Creo que los navegadores hacen esto automágicamente, ¿entonces quizás estaba probando con diferentes navegadores?

¿O tal vez es la configuración AllowEncodedSlashes ?


Algunas publicaciones aquí sugieren que el uso de OP es incorrecto, lo cual es falso.

Ampliando el comentario de Sam152, las cadenas de consulta pueden contener ambos? y / characters, consulte la sección 3.4 de http://www.ietf.org/rfc/rfc3986.txt , que es básicamente la especificación escrita por Tim Berners-Lee y sus amigos que rigen cómo debería funcionar la web.

El problema es que los analizadores mal escritos (o mal configurados, o mal utilizados) interpretan barras de cadena de consulta como separando componentes de ruta.

He visto ejemplos de la función pathinfo de PHP que se utiliza para analizar URL''s. Pathinfo no se escribió para analizar una URL. Sin embargo, puedes extraer la ruta usando parse_url y luego usar fileinfo para recuperar detalles de la ruta. Verá que parse_url maneja / y? en cadenas de consulta muy bien.

En cualquier caso, el problema general es que esta área es poco comprensible, incluso entre desarrolladores experimentados, y la mayoría de la gente (incluyéndome hasta hace poco) simplemente asume que cualquier cosa después del nombre del archivo debe ser urlencoded, lo que es evidentemente falso si toma los estándares en consideración.

tl; dr Lee la especificación :)


En tu configuración de Apache:

AllowEncodedSlashes On

Consulte la documentación para más información:
http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes

Editar: Hmm, esto puede ser lo que ya está trabajando ... tuve el mismo problema, y ​​lo que terminó solucionándome fue simplemente usar $_SERVER[''REQUEST_URI''] ya que tenía los datos que necesitaba.


Esto suena como otro caso de magic_quotes_gpc predeterminado. En el servidor que causa problemas, compruebe php.ini y asegúrese de que

magic_quotes_gpc = Off


¿Tienes mod_security instalado? Ver este hilo:

403 Forbidden on PHP page called with url encoded in a $ _GET parameter