Как удалить ссылку «Родительский каталог» из корневой папки в списке каталогов Apache - PullRequest
8 голосов
/ 15 марта 2012

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

Ответы [ 6 ]

25 голосов
/ 27 апреля 2012

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

IndexIgnore ..

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

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

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

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

4 голосов
/ 08 ноября 2012

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

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

То, что я придумал, - это использование селектора атрибутов URL-адреса CSS, чтобы скрыть ссылку «Родительский каталог», когда она ведет к родительскому элементу корня индекса. Он оставляет пустую строку, но, по крайней мере, он не такой пугающий, как ошибка «403 ЗАПРЕЩЕНА», которую получает пользователь, если он нажимает «Родительский каталог» слишком много раз.

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

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

Однако, кажется, что простое решение не работает в IE, потому что тип документа по умолчанию для HTML, который выдает Apache, слишком стар, чтобы использовать селекторы атрибутов.

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

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

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

    </body>
</html>

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

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

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

2 голосов
/ 10 июля 2017

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

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

<DirectoryMatch "^/www/download/.{1,}"> IndexIgnoreReset ON IndexIgnore _other </DirectoryMatch>
1 голос
/ 09 августа 2015

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

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

Примечание:

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

  • css " tr: nth-of-type (2) " указывает на вторую запись, которая должна управлять "СПРАВОЧНИКОМ РОДИТЕЛЯ", который мы хотим скрыть, если URL-адрес нашего основного корня.

Веселись!

0 голосов
/ 25 июня 2018

Для уточнения ... Позвольте нам контролировать этот материал из файла каталога .htaccess, т.е. файла .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.

0 голосов
/ 23 июля 2014

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

Если вы хотите запретить пользователям доступ к верхнему каталогу, удаление ссылки ничего не решит для вас, поскольку любой может просто удалить последний каталог из 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 даже без этой «Родительской папки» "ссылка.

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

  • Поместите «empty» index.html в каждую папку над «подпапкой». Apache предложит файл вместо списка, так что пользователи не будут знать, что находится в «секретном» или «кусте».

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

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

Что вы должны сделать:

  • установить DocumentRoot в /var/www/secret/hive/subfolder,

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

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

...