如何从Apache目录列表中的根文件夹中删除“父目录”链接

时间:2012-03-15 10:56:14

标签: .htaccess directory webserver apache

如何在Apache中为特定(根)文件夹及其子文件夹允许目录列表,但不显示指向该根文件夹的父目录的链接。当用户在子文件夹中时,会显示“父目录”链接以导航到其父目录,但是当用户位于根文件夹时,我需要删除/隐藏此“父目录”链接,以便用户无法移动到该根目录之上'等级。

6 个答案:

答案 0 :(得分:25)

您可以通过在.htaccess文件中添加以下内容来隐藏“父目录”链接:

IndexIgnore ..

但是这会为每个目录隐藏它。

如果您有权访问httpd-configs,可以尝试从每服务器上下文中删除该指令:

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

只要在更高的文件夹中没有IndexIgnore指令,它就适合你。

答案 1 :(得分:4)

我刚遇到同样的问题,这是第一个搜索结果,所以我想我会分享我的解决方案。在我的情况下,我无法访问httpd-configs,所以我采用了不同的方法。

因为我不会维护索引目录树,所以我需要一个可以存在于索引根目录中的解决方案,而不需要了解其子目录。但是,它确实使用索引根的绝对路径,因此如果您的父文件夹结构发生了很大变化,它可能对您不起作用。

我想到的是使用CSS URL属性选择器来隐藏“父目录”链接,当它指向索引根的父级时。它留下了一个空白行,但至少它并不像用户在单击父目录太多次时获得的“403 FORBIDDEN”错误那样令人生畏。

理论上,修复应该像在索引根目录的.htaccess文件中添加一行一样简单:

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

然而,似乎简单的解决方案在IE中不起作用,因为Apache吐出的html的默认doctype太旧而无法使用属性选择器。

相反,我们必须使用htaccess文件中的HeaderName和ReadmeName关键字,使用我们自己的doctype来包围Apache生成的代码。我选择了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文件:

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

此外,既然您已经完成了创建这些文件的所有麻烦,那么您也可以使索引更加时髦。除了你可以用CSS做的事情之外,apache doc on mod_autoindex还有很多可以用来调整内容的选项。

答案 2 :(得分:2)

我的解决方案如下:

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

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

答案 3 :(得分:1)

有一个解决这个问题的工作技巧,通过JQuery检查url路径名。 只需在.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>"

注意:

  • 您可能需要更改路径名长度值,在我的网站中是&#34; 4 &#34;因为我的存档根目录在辅助子目录中开始(如果你的主目录在主根目录中启动,请尝试不同的值,例如&#34; 3&#34;或&#34; 2&#34;,或者只是检查你的location.pathname长度)。

  • &#34; tr:nth-​​of-type(2)&#34; css指向第二个记录,即应该管理&#34; PARENT DIRECTORY&#34;如果网址是我们的主要根目录,我们想要隐藏。

玩得开心!

答案 4 :(得分:0)

好像你没有问正确的问题。

如果您的目的是阻止用户访问上层目录,删除链接将无法为您解决任何问题,因为任何人都可以从URL中删除最后一个目录。

例如,如果您的子文件夹为/var/www/secret/hive/subfolderDocumentRoot设置为/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将拒绝展示 上市,因此用户不会知道“秘密”或“蜂巢”中的内容。

但是,如果用户能够以某种方式猜测文件的名称,他们仍然可以组装一个有效的网址,如http://your.example.com/secret/password.txt并且有足够的运气(和/或尝试),他们仍然可以得到一些非公开信息。

应该做的是:

  • DocumentRoot设为/var/www/secret/hive/subfolder

  • 或(更好)保留DocumentRoot,但将所有非公开的内容移出/var/www

所以http://your.example.com/只会显示公开信息,并且没有(HTTP)方式用户甚至可以询问上面的任何内容。

答案 5 :(得分:0)

更多说明... 让我们从目录.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的测试。