如何允许在Apache中列出特定(根)文件夹及其子文件夹的目录,但不显示指向该根文件夹父文件夹的链接。当用户位于子文件夹中时,会显示"父目录"链接以导航到其父目录,但当用户位于根文件夹时,我需要删除/隐藏此"父目录"链接,这样用户就无法移动到该"根"层次结构之上。
您可以通过在.htaccess文件中添加以下内容来隐藏"父目录"链接:
IndexIgnore ..
但这将为每个目录隐藏它。
如果您可以访问httpd配置,您可以尝试从每个服务器上下文中删除该指令:
<DirectoryMatch "^/(?!var/www/your-root/subfolder)">
...
</DirectoryMatch>
只要在较高的文件夹中没有IndexIgnore指令,它就应该适用于您。
我刚刚遇到了同样的问题,这是第一个搜索结果,所以我想分享我的解决方案。在我的情况下,我无法访问httpd-configs,所以我采用了不同的方法。
因为我不会维护索引目录树,所以我需要一个解决方案,该解决方案可以只存在于索引根中,而不需要对其子目录有任何特定的了解。但是,它确实使用了指向索引根的绝对路径,所以如果父文件夹结构发生了很大变化,它可能不适合您。
我想到的是使用CSS URL属性选择器来隐藏指向索引根的父目录的"父目录"链接。它留下了一行空白,但至少它不像用户多次单击"父目录"时出现的"403禁止"错误那样令人生畏。
理论上,修复应该像在索引根的.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 doctype,尽管可能有一个更合适的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),也可以一直返回到IE7。
此外,既然您已经经历了创建这些文件的所有麻烦,那么您还可以让索引更加时髦。mod_autoindex上的apache文档除了可以使用CSS之外,还有一系列可以用来调整的选项。
我的解决方案如下:
<Directory "/www"> Options +Indexes IndexIgnore .. _other </Directory>
<DirectoryMatch "^/www/download/.{1,}"> IndexIgnoreReset ON IndexIgnore _other </DirectoryMatch>
似乎你问的问题不对。
如果你的目的是防止用户访问上层目录,那么删除链接不会解决任何问题,因为任何人都可以简单地从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放在"subfolder"上方的每个文件夹中。Apache将提供文件而不是列表,这样用户就不知道"秘密"或"蜂窝"中有什么。
-
禁止在"子文件夹"上方的每个文件夹中列出。Apache将拒绝显示这样用户就不会知道"秘密"或"蜂巢"中有什么了。
然而,如果用户能够以某种方式猜测文件的名称,他们仍然可以组装一个有效的URL,如http://your.example.com/secret/password.txt
,如果运气好(和/或尝试),他们仍然能够获得一些非公开信息。
您应该做的是:
-
将
DocumentRoot
设置为/var/www/secret/hive/subfolder
, -
或者(最好)保留DocumentRoot,但将所有非公共移出
/var/www
。
因此CCD_ 11将只显示公共信息,并且用户甚至无法(HTTP)向请求任何上述信息。
有一个解决这个问题的有效技巧,通过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>"
注:
-
您可能需要更改路径名长度值,在我的站点中为"4",因为我的存档根目录在辅助子目录中启动(如果您的存档根文件在主根目录中启动,请尝试不同的值,例如"3"或"2",或者只需先检查您的位置。路径名长度即可)。
-
"tr:nth of type(2)"css指向第二条记录,如果url位置是我们的主根,那么它应该管理我们想要隐藏的"父目录"。
玩得开心!
有关更多说明。。。让我们从目录.htaccess文件中控制这些东西,即存在于目标目录中的.htacccess文件。它可能采用以下配置:
# 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
应该按照上面的代码所示编写。上面的代码段已经用Apache2.4.18进行了测试。