如何在Apache中为特定(根)文件夹及其子文件夹允许目录列表,但不显示指向该根文件夹的父目录的链接。当用户在子文件夹中时,会显示“父目录”链接以导航到其父目录,但是当用户位于根文件夹时,我需要删除/隐藏此“父目录”链接,以便用户无法移动到该根目录之上'等级。
答案 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/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将拒绝展示 上市,因此用户不会知道“秘密”或“蜂巢”中的内容。
但是,如果用户能够以某种方式猜测文件的名称,他们仍然可以组装一个有效的网址,如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的测试。