2012-07-22 38 views
5

Tengo unas pocas llamadas al is_dir en una página. Ellos siempre han trabajado sin problemas.PHP: open_basedir ruta permitida

Hace unos días, la empresa de alojamiento actualizó PHP de 5.2 a 5.3. Desde entonces, todas mis llamadas a is_dir han dado como resultado el error siguiente (mensaje):

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

Esto me intriga.

Es evidente que, de acuerdo con el mensaje de error (y php_info también), el directorio /home/virtual/domain.com (sin barra final, por lo que incluir subdirectorios) está incluido/habilitada en open_basedir, y los archivos que is_dir está tratando de recorrer son todos ubicado en subcarpetas debajo de esa carpeta. Entonces, ¿por qué no están dentro de los caminos permitidos? ¡Claramente lo son!

Curiosamente, este error aparece que sólo aparecen cuando is_dir vuelve falsa, es decir, cuando el archivo es no una carpeta, pero un archivo normal. Parece iterar a través de directorios todo bien sin lanzar errores.

Pregunta similar publicada anteriormente aquí: Open_basedir restriction oddness (no se encontró ninguna solución).

¿Alguien tiene alguna idea?

(Nota: El cambio de la configuración de PHP no es una opción, ya que esto es un servidor compartido y no tener ningún acceso de administrador)

+0

¿Este es el mensaje de error real? ¿O hay ciertos personajes especiales en algún camino? – SteAp

+0

Algunas rutas tienen algunos caracteres especiales: '&' (ampersand) y '_' (guión bajo). Pero el error aparece incluso para aquellas rutas que no contienen ningún tipo de caracteres especiales (a menos que las letras mayúsculas cuenten como caracteres especiales). Y los caracteres especiales están todos en nombres de directorio (y se analizan e iteran correctamente en aquellos casos en que 'is_dir' se evalúa como' TRUE'), nunca en nombres de archivo (que es donde ocurre el error). –

Respuesta

4

Existe un error no arreglado en PHP que se activa cuando se abre o se marca una ruta que tiene un archivo existente como prefijo y una parte no existente como sufijo. En su ejemplo, existe la parte /home/virtual/domain.com/public_html/galleries/img/002.JPG con el sufijo / (barra diagonal en la ruta).

Existe una explicación de que esto no es un error: "Este es el comportamiento esperado. Una ruta que no existe (la que tiene la barra diagonal) se considera fuera de la base. ", Pero no lo creo. Este error solo se desencadena si la primera parte de la ruta es un archivo existente.

errores de PHP:

3

Resulta que la respuesta era muy simple, pero completamente ilógico:

Al crear (concatenar) las rutas para iterar, por algún motivo he codificado una barra inclinada: cómo termina la ruta anterior en img/002.JPG/ con una barra al final. Al eliminar esta barra, se corrigió el error. Esto también explica por qué no falló en los directorios (que se supone que tienen barras diagonales), solo en los archivos (que no lo son).

Según la documentación PHP, is_dir() debe devolver TRUE si la ruta especificada representa un directorio existente; y FALSE en todos los demás casos, incluido si el archivo especificado no existe (que img/002.JPG/ no contiene).

Así que estoy todavía un poco confundido en cuanto a por qué no acaba de regresar FALSE la forma en que solía en PHP 5.2, pero en cambio hace que este lugar abstrusa y francamente francamente mal declaración de que el archivo no se encuentra dentro del camino permitido ... pero al menos funciona de nuevo ahora.

Cuestiones relacionadas