2008-11-03 7 views
14

Aquí está la estructura de directoriosphp enlace al archivo de imagen, fuera de directorio web por defecto

/domain.com 
/public_html 
    /functions 
    /image 
    /mobile 
    /www 

la carpeta /domain.com/public_html/www tiene un archivo index.php el directorio web por defecto es/usuario/public_html/www en el archivo de índice es una inclusión que incluye las funciones con incluye "../funciones/función.inc" esto funciona sin problema cuando quiero hacer un enlace a una imagen en la carpeta de imágenes que no consigo cualquier resultado por ejemplo

<img src="../image/graphic/logo.gif" alt="alt text"/> 

¿Alguien tiene alguna idea de por qué el enlace a la imagen no funciona y cómo vincularse correctamente con el archivo de imagen?

me trataron <img src="<?php echo $_SERVER['PHP_SELF']; ?>../image/graphic/logo.gif" alt="alt text"/>

pero eso me da el mismo resultado cuando construyo un enlace alrededor de la imagen para llegar a las propiedades que recibo esto como ruta http://domain.com/image/pc/tattoo_small/small_2008_10_22_001.JPG la ruta debe ser http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG cuando intento para navegar directamente a esta URL http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG consigo un archivo 404 no se encuentra el error porque el directorio web por defecto es /domain.com/public_html/www me trataron http://domain.com/../image/pc/tattoo_small/small_2008_10_22_001.JPG para llegar a la carpeta de imágenes, pero eso tampoco ayuda.

¿Alguien alguna idea o es imposible vincular html a archivos gráficos fuera del directorio web predeterminado?

gracias por leer hasta

Gracias por las respuestas hasta el momento. Voy a tratar de resolver mi problema con una de las soluciones recomendadas y reportar mi solución de trabajo aquí. Quería que la carpeta de imágenes estuviera al mismo nivel que la carpeta www y la de dispositivos móviles porque algunas de las imágenes utilizadas para la versión de pc (www) y la versión para dispositivos móviles son las mismas. Por supuesto, es más fácil obtener una carpeta de imágenes en el www y en la carpeta móvil, y creo que eso es lo que voy a hacer.

gracias a todos por el consejo. La razón principal por la que no voy a trabajar con un guión es que un guión será una solución difícil para un problema fácil y también porque realmente no veo cómo puedes envolver tu imagen en una clase CSS y cómo proporcionar alt texto para una imagen.

Respuesta

9

No puede mostrar una página que está fuera del directorio web porque la ruta de acceso no funciona, es decir, http://mydomain.com/../page.html simplemente se refiere a una ubicación inaccesible.

Si realmente desea servir archivos (estáticos) que están fuera de la webroot, puede escribir un pequeño script PHP para leerlos y darles salida. Por lo tanto, redirigiría las solicitudes al script PHP, y el PHP leería el archivo apropiado del disco y lo devolvería.

+3

Y querrías hacerlo REALMENTE con mucho cuidado o introducirás un gran agujero de seguridad :) –

1

Es imposible vincular directamente a un archivo fuera del área de acceso web del servidor web.

Sin embargo, puede escribir un script PHP que las imágenes del poder para

<img src="my_php_proxy.php"> 

debido a que PHP puede enviar datos de imagen, así como HTML. Esta "imagen" PHP no está restringida a la misma carpeta que las cosas accesibles en la web, sino que puede acceder a cualquier archivo legible en el servidor. Consulte http://www.electrictoolbox.com/image-headers-php/ para obtener más información

27

No es posible acceder directamente a los archivos fuera de la raíz web; esta es una restricción de seguridad incorporada que está ahí por una buena razón.

Sin embargo, es posible utilizar un script PHP para mostrar estas imágenes. De esta manera se puede llamar una imagen como:

/image.php?file=myfile.jpg 

y utilizar file_get_contents() para obtener el contenido del archivo e imprimirlas en tu navegador. También debe enviar los encabezados al cliente, en este caso utilizando la función header() de PHP. Un breve ejemplo:

<?php 

    $file = basename(urldecode($_GET['file'])); 
    $fileDir = '/path/to/files/'; 

    if (file_exists($fileDir . $file)) 
    { 
     // Note: You should probably do some more checks 
     // on the filetype, size, etc. 
     $contents = file_get_contents($fileDir . $file); 

     // Note: You should probably implement some kind 
     // of check on filetype 
     header('Content-type: image/jpeg'); 

     echo $contents; 
    } 

?> 

El uso de un script para esto tiene algunas ventajas más:

  • Puede realizar un seguimiento de las descargas e implementar un contador, por ejemplo
  • Puede restringir los archivos a los usuarios autenticados
  • etc ...
+4

Tu script tiene un agujero de seguridad importante: debería usar algo como $ file = basename (urldecode ($ _ GET ['file) '])). De lo contrario, esto podría funcionar: /image.php?file=../../../../../../../../etc/passwd – Piskvor

+1

No según [http: // php .net/manual/es/function.urldecode.php] (http://php.net/manual/en/function.urldecode.php) 'El uso de urldecode() en un elemento en $ _GET o $ _REQUEST podría tener inesperado y resultados peligrosos ". –

0

Usted puede hacer un enlace al directorio de imagen dentro del public___html , mueva el directorio de imágenes a public_html o, si tiene un gusto particular hacia soluciones intrincadas, puede escribir un guión que lea el archivo de imagen y lo muestre al usuario (por supuesto, a menos que haga una lista blanca de todas las imágenes, puede tener un potencial problema de seguridad en sus manos).

16

Si está utilizando Apache como servidor, se puede establecer un alias a un directorio en httpd.conf ...

<IfModule mod_alias.c> 

    Alias /images/ "/User/Public_html/Image/" 

    <Directory "/User/Public_html/Image"> 
     Options Indexes MultiViews 
     AllowOverride None 
     Order allow,deny 
     Allow from all 
    </Directory> 

</IfModule> 

IIRC, la carpeta con alias no tiene que estar dentro de la web raíz.

+1

Esto me genera "NetworkError: 403 Forbidden" para las imágenes. ¿Cualquier sugerencia? – Sadee

5

Cree el enlace simbólico dentro de la raíz web que apunta al directorio que desea.

cd public_html 
ln -s ../images 

Apache necesita directiva de configuración Options +FollowSymlinks para que esto funcione (es posible colocarlo en .htaccess en su raíz web).

La escritura de un script PHP que sirve archivos de raíz web externa derrota el propósito de la raíz web. Debería verificar las rutas con mucho cuidado para evitar exponer todo el disco a la web.

Cuestiones relacionadas