Как удалить ссылку "родительский каталог" из корневой папки в списке каталогов Apache

Как я могу разрешить список каталогов в Apache для определенной (корневой) папки и ее подпапок, но без указания ссылки на родителя этой корневой папки. Когда пользователь находится в подпапке, отображается ссылка "родительский каталог" для перехода к родительскому каталогу, но когда пользователь находится в корневой папке, мне нужно удалить/скрыть эту ссылку "родительский каталог", чтобы пользователь не мог перемещаться выше этой иерархии "корневой".

6 ответов


Я просто столкнулся с той же проблемой, и это был первый результат поиска, поэтому я решил поделиться своим решением. У меня нет доступа к httpd-configs в моем случае, поэтому я пошел с другим подходом.

поскольку я не буду поддерживать индексированное дерево каталогов, мне нужно было решение, которое могло бы существовать только в корне индекса без каких-либо конкретных знаний о его подкаталогах. Однако он использует абсолютный путь к корню индекса, поэтому, если структура родительской папки изменяет лот, это может не сработать для тебя.

Я придумал использовать селектор атрибутов URL CSS, чтобы скрыть ссылку "родительский каталог", когда она привела к родительскому корню индекса. Он оставляет пустую строку, но, по крайней мере, это не так пугающе, как ошибка "403 FORBIDDEN", которую пользователь получает, если они нажимают родительский каталог слишком много раз.

теоретически исправление должно быть таким же простым, как добавление одной строки к корневому индексу.файл htaccess:

IndexHeadInsert "<style type=\"text/css\">a[href=\"/absolute/path/to/index/root/parent/\"] {display: none;}</style>"
, это кажется, что простое решение не работает в IE, потому что тип документа по умолчанию html, который выплевывает Apache, слишком стар для использования селекторов атрибутов.

вместо этого мы должны окружить сгенерированный код Apache нашим собственным doctype, используя HeaderName и ключевые слова ReadmeName в файле htaccess. Я пошел с HTML5 doctype, хотя может быть более подходящий, который работает.

.файл 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

_index_header.формат html файл:

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

(обратите внимание, что селектор CSS относится к родительскому корню индекса)

работает во всех последних версиях браузера, которые я тестировал (FF, IE, Chrome, Safari, Opera), а также на всем пути к IE 7.

кроме того, теперь, когда вы прошли через все проблемы создания этих файлов, вы можете также сделать свой индекс более шикарным. The Apache doc на mod_autoindex имеет кучу вариантов вы можете использовать для настройки вещей, помимо того, что вы можете сделать с CSS.


вы можете скрыть ссылку "родительский каталог", добавив следующее к вашему .файл htaccess:

IndexIgnore ..

но это скроет его для каждого каталога.

Если у вас есть доступ к httpd-configs, вы можете попытаться удалить директиву из контекста на сервере:

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

пока нет директивы IndexIgnore в более высокой папке, она должна работать для вас.


мое решение следующее:

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

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

есть рабочий трюк для решения этой проблемы, проверка пути url через JQuery. Просто добавьте этот код сверху .htaccess файл (очевидно, мы не можем разделить строки абзаца здесь):

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

Примечание:

  • вам может потребоваться изменить значение длины пути, на моем сайте"4 "потому что мой корень архива начинается во вторичном подкаталоге (если ваш начинается в основном корне, попробуйте разные значения, например" 3 " или " 2", или просто Проверьте свое местоположение.длина пути перед всеми).

  • в "tr: nth-of-type (2)" css указывает на вторую запись, которая должна управлять "родительским каталогом", который мы хотим скрыть, если расположение url-адреса является нашим основным корнем.

удачи!


похоже, вы задаете неправильный вопрос.

если ваша точка зрения, чтобы предотвратить пользователей от ссылке верхний каталог, удаление ссылки ничего не решит для вас, так как любой может просто удалить последний каталог из URL.

например, если ваша подпапка /var/www/secret/hive/subfolder и свой DocumentRoot установлено значение /var/www, и Вы делитесь ссылкой http://your.example.com/secret/hive/subfolder, любой может получить доступ http://your.example.com/secret/ или http://your.example.com/secret/hive даже без этой " родительской папки" ссылка на сайт.

что вы могли бы сделать это:

  • поставить "пустой указатель".html в каждой папке выше "подпапки". Затем Apache предложит это файл вместо списка, так что пользователи не будут знать, что в "секрет" или "улей".

  • отключить список в каждой папке выше "подпапки". Затем Apache откажется показывать список, поэтому пользователи не будут знать, что находится в "secret" или "hive".

однако, если пользователи как-то удалось Угадай имена файлов, они все еще могут собрать действительный URL-адрес, например http://your.example.com/secret/password.txt и с достаточной удачей (и / или попытками), они все еще могут получить некоторую непубличную информацию.

что ты должны do is:

  • set DocumentRoot to /var/www/secret/hive/subfolder,

  • или (лучше) сохранить DocumentRoot, но переместить все, что не является публичным из /var/www.

так http://your.example.com/ покажет только общедоступную информацию, и нет (HTTP) способа, как пользователи могут даже задать для чего-либо выше.


дополнительные разъяснения... Пусть мы контролируем этот материал из каталога .файл htaccess, i.e .файл htaccess, существующий в целевом каталоге. Он может принимать следующие конфигурации:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
 order allow,deny
 deny from all
</Files>

<IfModule mod_autoindex.c>
            Options Indexes FollowSymLinks 
            IndexIgnore ".." #LOOK AT THIS LINE     
            IndexOptions FancyIndexing
            IndexOptions VersionSort
           # IndexOptions HTMLTable
            IndexOptions FoldersFirst
            IndexOptions IconsAreLinks
            IndexOptions IgnoreCase
           # IndexOptions SuppressDescription
            AddDescription "Last generated backup result" backuplog.txt
            IndexOptions SuppressHTMLPreamble
            IndexOptions XHTML
            IndexOptions IconWidth=32
            IndexOptions IconHeight=32
            IndexOptions NameWidth=*
            IndexOrderDefault Descending Name
            HeaderName /index-style/header.html
            ReadmeName /index-style/footer.html
        </ifModule>

для скрытия ссылки родительского каталога,IndexIgnore должно быть написано, как показано в коде выше. Приведенный выше фрагмент был протестирован с Apache 2.4.18.