2009-01-20 7 views
5

Tengo dos servidores Apache que ejecutan PHP. Uno acepta forward-rayas verticales en la cadena de consulta y lo pasa a lo largo de PHP en la forma esperada, por ejemplo:¿Cómo se configura Apache/PHP para aceptar barras en las cadenas de consulta?

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

obras 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 en 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 la rechace.

+0

¿Ha revisado los archivos de registro? – Gumbo

+0

Estoy 99.9% seguro de haberme encontrado con esto antes, pero no puedo recordar por mi vida lo que hice para solucionarlo. Estoy mirando alrededor ahora ... –

Respuesta

1

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 quizás es la configuración AllowEncodedSlashes?

+8

Se permiten barras en la cadena de consulta, según RFC: http://www.ietf.org/rfc/rfc3986.txt – Sam152

+1

'AllowEncodedSlashes' solo es necesario cuando la barra codificada está en la parte de la ruta (lo cual está prohibido por defecto) –

0

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 
+0

De hecho, esto está apagado. También lo es magic_quotes_runtime. –

0

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

Probablemente haya 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 http: //

+0

PHP obtiene la página en absoluto; Apache arroja un error de excepción 403 en su lugar. –

0

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?

+0

El problema es que con mi configuración OTRA, ¡esto funciona! –

1

En su configuración de Apache:

AllowEncodedSlashes On 

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

Editar: Hmm, esto puede ser lo que ya tiene trabajo ... Yo tenía el mismo problema , y lo que terminó por arreglarlo para mí fue simplemente usar $_SERVER['REQUEST_URI'] ya que tenía los datos que necesitaba.

7

Unos puestos aquí sugieren el uso de la OP es incorrecto, lo cual es falso.

Expandiendo el comentario de Sam152, las cadenas de consulta pueden contener ambas? y/caracteres, 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 las direcciones URL. 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 comprendida, incluso entre desarrolladores experimentados, y la mayoría de las personas (incluyéndome hasta hace poco) simplemente asumen que cualquier cosa después del nombre de archivo debe urlencoded, que es evidentemente falso si toma los estándares en consideración.

tl; dr Leer la especificación :)

Cuestiones relacionadas