2012-03-15 22 views
8

Come posso consentire l'elenco di directory in Apache per una cartella (radice) specifica e le relative sottocartelle, ma senza mostrare un collegamento al genitore di tale cartella radice. Quando l'utente si trova in una sottocartella, viene visualizzato il link "Directory padre" per spostarsi al suo genitore, ma quando l'utente si trova nella cartella principale ho bisogno di rimuovere/nascondere questo link "Directory padre" in modo che l'utente non possa spostarsi sopra quella 'root ' gerarchia.Come rimuovere il collegamento "Directory padre" dalla cartella principale nella directory Apache che elenca

+0

non è possibile. Potresti scrivere il tuo script php per fare l'elenco delle directory. Non vedere in nessun altro modo. Ma non mi preoccuperei Il link non dovrebbe essere lì, ma non è come se accadesse qualcosa di terribile quando lo clicchi. – Gerben

+0

Probabilmente non stai facendo la domanda giusta: indipendentemente dal link, qualsiasi utente può ancora arrivare al genitore rimuovendo l'ultima cartella dall'URL. È necessario assicurarsi che il server non restituisca nulla su tale URL. –

risposta

3

Ho appena avuto lo stesso problema, e questo è stato il primo risultato di ricerca, quindi ho pensato di condividere la mia soluzione. Nel mio caso non ho accesso a httpd-configs, quindi ho optato per un approccio diverso.

Poiché non gestirò l'albero della directory indicizzato, avevo bisogno di una soluzione che potesse esistere solo nella radice dell'indice senza alcuna conoscenza specifica delle sue sottodirectory. Tuttavia, utilizza un percorso assoluto per la radice dell'indice, quindi se la struttura della cartella padre cambia molto, potrebbe non funzionare per te.

Quello che mi è venuto in mente era usare un selettore di attributi URL CSS per nascondere il collegamento "Directory padre" quando veniva indirizzato al padre della radice dell'indice. Lascia una riga vuota, ma almeno non è così intimidatorio come l'errore "403 FORBIDDEN" che un utente ottiene se fa clic su Elenco padre troppe volte.

In teoria, la correzione dovrebbe essere semplice come l'aggiunta di una riga nel file .htaccess del tuo principale indice:

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

Tuttavia, sembra che la soluzione semplice non funziona in IE, perché il doctype default del html che Apache sputa è troppo vecchio per usare i selettori di attributo.

Invece, dobbiamo circondare il codice generato da Apache con il nostro doctype usando le parole chiave HeaderName e ReadmeName nel file htaccess. Sono andato con il doctype HTML5, anche se potrebbe esserci uno più appropriato che funzioni.

file .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 

lima _index_header.html: file di

<!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> 

(Si noti che il selettore CSS è quello dell'indice radice del genitore)

Funziona con tutte le ultime versioni del browser che ho testato su (FF, IE, Chrome, Safari, Opera), e anche su IE 7.

Inoltre, ora che hai passato tutta la fatica di creare quei file, potresti anche rendere più accattivante il tuo indice. Il apache doc on mod_autoindex ha un sacco di opzioni che puoi usare per modificare le cose, oltre a quello che puoi fare con i CSS.

+0

L'approccio css sembra nascondere solo il collegamento (come dici tu). Puoi usare inserire un tag '

23

è possibile nascondere il link "Parent Directory" aggiungendo quanto segue al file .htaccess:

IndexIgnore .. 

ma questo sarà nasconderlo per ogni directory.

Se si ha accesso ai httpd-configurazioni si potrebbe provare a rimuovere la direttiva dal contesto per-server:

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

Finché non esiste una direttiva IndexIgnore in una cartella superiore dovrebbe funzionare per voi .

+2

Questo dovrebbe essere elencato come risposta accettata. – itoctopus

+0

@itoctopus Sono d'accordo. È semplice e pulito. La risposta accettata è un kludge. – dr01

0

Sembra che tu non stia facendo la domanda giusta.

Se il tuo punto è impedire agli utenti di di accedere a nella directory superiore, rimuovere il collegamento non risolverà nulla per te dato che chiunque può semplicemente rimuovere l'ultima directory dall'URL.

Ad esempio, se la sottocartella è /var/www/secret/hive/subfolder e la vostra DocumentRoot è impostato su /var/www, e si condivide collegamento http://your.example.com/secret/hive/subfolder, chiunque può ancora accedere http://your.example.com/secret/ o http://your.example.com/secret/hive anche senza che puntano cartella "Parent".

Che cosa si potrebbe fare è:

  • Put index.html "vuoto" in ogni cartella sopra "sottocartella". Apache offrirà quindi il file anziché l'elenco, in modo che gli utenti non sappiano cosa c'è in "segreto" o "hive".

  • Disabilitare l'elenco in ogni cartella sopra "sottocartella". Apache si rifiuterà quindi di mostrare la lista , in modo che gli utenti non sappiano cosa c'è in "segreto" o "hive".

Tuttavia, se gli utenti sono in qualche modo in grado di indovinare nomi dei file, essi potrebbero ancora assemblare un URL valido come http://your.example.com/secret/password.txt e con abbastanza fortuna (e/o tentativi), essi potrebbero ancora raggiungere alcune non- informazione pubblica.

Quello che dovrebbe fare è:

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

  • o (meglio) tenere DocumentRoot ma spostare tutto ciò che non è pubblico fuori /var/www.

così http://your.example.com/ mostrerà solo le informazioni pubbliche e non c'è (HTTP) modo in cui gli utenti possono anche chiedere per qualsiasi cosa sopra.

1

C'è un trucco di lavoro per risolvere questo problema, controllando il percorso del percorso url tramite JQuery. Basta aggiungere questo codice nella parte superiore del file .htaccess (ovviamente possiamo linee paragrafo non separati qui):

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:

  • potrebbe essere necessario modificare il percorso valore di lunghezza, nel mio sito è "" perché la mia radice di archivio inizia in una sottodirectory secondaria (se il tuo inizia nella root principale, prova valori diversi ad es."3" o "2", o semplicemente controlla la tua posizione. Lunghezza del percorso prima di tutto).

  • il "tr: nth-of-type (2)" punti CSS per il secondo record, che è quella supposta per gestire il "Parent Directory" vogliamo nascondere se il percorso URL è il nostro principale radice.

Buon divertimento!

+0

non c'è bisogno di jquery. 'IndexHeadInsert" "' dovrebbe funzionare correttamente. Per qualche ragione la mia "directory principale" è la terza riga (ho una riga di intestazione e un separatore prima che inizi l'elenco delle directory). Cambia ''/'' a qualunque nome di percorso desideri nascondere per il link principale, ad es. ''/ builds /'' - dovrebbe essere automaticamente nascosto per un nome di percorso di root comunque. – Luke

0

La mia soluzione è la seguente:

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

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