2012-03-15 18 views
8

¿Cómo puedo permitir el listado de directorios en Apache para una carpeta específica (raíz) y sus subcarpetas, pero sin mostrar un enlace al padre de esa carpeta raíz. Cuando el usuario está en una subcarpeta, se muestra el enlace 'Parent Directory' para navegar a su principal, pero cuando el usuario está en la carpeta raíz, necesito eliminar/ocultar este enlace 'Parent Directory' para que el usuario no pueda moverse por encima de esa 'raíz 'jerarquía.Cómo eliminar el enlace 'Directorio principal' de la carpeta raíz en la lista del directorio Apache

+0

no es posible. Puede escribir su propia secuencia de comandos php para hacer la lista del directorio. No veo de otra manera. Pero no me molestaría. El enlace no debería estar allí, pero no es como si algo terrible sucediera al hacer clic en él. – Gerben

+0

Probablemente no haga la pregunta correcta: Independientemente del enlace, cualquier usuario puede llegar al padre eliminando la última carpeta de la URL. Debe asegurarse de que el servidor no devuelva nada en dicha URL. –

Respuesta

3

Me encontré con el mismo problema, y ​​este fue el primer resultado de búsqueda, así que pensé en compartir mi solución. No tengo acceso a httpd-configs en mi caso, así que fui con un enfoque diferente.

Como no mantendré el árbol de directorios indexados, necesitaba una solución que pudiera existir solo en la raíz del índice sin ningún conocimiento específico de sus subdirectorios. Sin embargo, utiliza una ruta absoluta a la raíz del índice, por lo que si la estructura de la carpeta principal cambia mucho, puede que no funcione.

Lo que se me ocurrió fue utilizar un selector de atributo de URL CSS para ocultar el enlace "Directorio principal" cuando llevaba al padre de la raíz del índice. Deja una fila en blanco, pero al menos no es tan intimidante como el error "403 PROHIBIDO" que recibe un usuario si hace clic en el directorio principal demasiadas veces.

Teóricamente, la revisión debe ser tan simple como añadir una línea a su archivo .htaccess de la raíz de índice:

IndexHeadInsert "<style type=\"text/css\">a[href=\"/absolute/path/to/index/root/parent/\"] {display: none;}</style>" 

Sin embargo, parece que la solución simple no funciona en IE debido a que el tipo de documento predeterminado de la html que Apache escupe es demasiado viejo para usar selectores de atributos.

En su lugar, tenemos que rodear el código generado por Apache con nuestro propio doctype usando las palabras clave HeaderName y ReadmeName en el archivo htaccess. Fui con el doctype HTML5, aunque puede haber uno más apropiado que funcione.

archivo .htaccess:

Options +Indexes 

IndexIgnore "_index_header.html" "_index_footer.html" 

HeaderName "/absolute/path/to/root/index/_index_header.html" 
ReadmeName "/absolute/path/to/root/index/_index_footer.html" 

IndexOptions +SuppressHTMLPreamble 

archivo _index_header.html: archivo

<!DOCTYPE html> 
<html> 
    <head> 
     <title>title</title> 
     <style type="text/css"> 
      a[href="/absolute/path/to/index/root/parent/"] {display: none;} 
     </style> 
    </head> 
    <body> 

_index_footer.html:

</body> 
</html> 

(Tenga en cuenta que el selector CSS es que el índice de la raíz padre)

Funciona con todas las versiones de navegador más recientes en las que lo probé (FF, IE, Chrome, Safari, Opera) y también desde IE 7.

Además, ahora que pasó por todos los problemas para crear esos archivos, también podría hacer que su índice sea más atractivo. El apache doc on mod_autoindex tiene un montón de opciones que puede usar para ajustar cosas, además de lo que puede hacer con CSS.

+0

El enfoque CSS parece ocultar el enlace solo (como usted menciona). Puede usar insertar una etiqueta '

23

puede ocultar el "Directorio de Padres" enlace añadiendo lo siguiente a su archivo .htaccess:

IndexIgnore .. 

pero esto va a ocultarlo por cada directorio.

Si usted tiene acceso a los httpd-configuraciones se podría tratar de eliminar la directiva de contexto por servidor:

<DirectoryMatch "^/(?!var/www/your-root/subfolder)"> 
... 
</DirectoryMatch> 

Mientras que no hay disposiciones IndexIgnore en una carpeta superior que debería funcionar para usted .

+2

Esto debe figurar como la respuesta aceptada. – itoctopus

+0

@itoctopus Estoy de acuerdo. Es simple y limpio. La respuesta aceptada es un kludge. – dr01

0

Parece que no hace la pregunta correcta.

Si su objetivo es evitar que los usuarios de accedan a el directorio superior, eliminar el enlace no resolverá nada ya que cualquiera puede simplemente quitar el último directorio de la URL.

Por ejemplo, si su subcarpeta es /var/www/secret/hive/subfolder y su DocumentRoot se establece en /var/www, y que comparten enlace http://your.example.com/secret/hive/subfolder, cualquier persona podrá seguir teniendo acceso http://your.example.com/secret/ o http://your.example.com/secret/hive incluso sin ese vínculo "carpeta principal".

Lo que podría hacer es:

  • Put index.html "vacío" en cada carpeta anterior "subcarpeta". Apache ofrecerá ese archivo en lugar de un listado, por lo que los usuarios no sabrán qué hay en "secreto" o "colmena".

  • Desactivar el listado en cada carpeta arriba de "subcarpeta". Apache se negará a mostrar el listado, por lo que los usuarios no sabrán qué hay en "secreto" o "colmena".

Sin embargo, si los usuarios son capaces de alguna manera suposición nombres de archivos, aún podrían montar una URL válida como http://your.example.com/secret/password.txt y con bastante suerte (y/o intentos), que todavía podría llegar a algunos no información pública.

Lo que debe hacer es:

  • conjunto DocumentRoot-/var/www/secret/hive/subfolder,

  • o (mejor) mantener DocumentRoot sino que se mueven todo lo que no es pública de /var/www.

por lo http://your.example.com/ mostrará sólo la información pública y no hay (HTTP) forma en cómo los usuarios pueden pedir incluso para cualquier cantidad superior.

1

Hay un truco de trabajo para resolver este problema, verificando el nombre de ruta de la url a través de JQuery. Sólo tiene que añadir este código en la parte superior de su archivo .htaccess (obviamente podemos líneas separadas párrafo no aquí):

IndexHeadInsert "<script src=' https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js '></script><script>$(document).ready(function(){if(document.location.pathname.split('/').length<4){$('tr:nth-of-type(2)').hide();}});</script>"

Nota:

  • puede que tenga que cambiar el nombre de ruta valor de longitud, en mi sitio es "" porque mi raíz de archivo se inicia en un subdirectorio secundario (si el tuyo se inicia en la raíz principal, prueba diferentes valores, por ejemplo"3" o "2", o simplemente verifique su ubicación. Longitud del nombre de ruta antes de todo).

  • la "tr: nth-de-tipo (2)" css puntos al segundo registro, que es la supuesta para gestionar el "directorio padre" queremos ocultar si la ubicación url es nuestro principal raíz.

Have fun!

+0

sin necesidad de jquery. 'IndexHeadInsert" "' debería funcionar bien. Por alguna razón, mi "directorio principal" es la tercera fila (tengo una fila de encabezado y un separador antes de que comience la lista de directorios). Cambia ''/'' a cualquier nombre de ruta para el que quieras ocultar el enlace principal, ej. ''/ builds /' '- de todos modos debería ocultarse automágicamente para un nombre de ruta raíz. – Luke

0

Mi solución es la siguiente:

<Directory "/www"> Options +Indexes IndexIgnore .. _other </Directory> 

<DirectoryMatch "^/www/download/.{1,}"> IndexIgnoreReset ON IndexIgnore _other </DirectoryMatch> 
Cuestiones relacionadas