使用 htaccess,如何限制查看目录内容,但允许服务器使用内容?

Posted

技术标签:

【中文标题】使用 htaccess,如何限制查看目录内容,但允许服务器使用内容?【英文标题】:Using htaccess, how to restrict seeing directory contents, but allow server to use the contents? 【发布时间】:2011-09-03 16:15:46 【问题描述】:

更具体地说,我有一个 htaccess 文件,它限制任何人查看目录内容。这样,没有人可以使用以下命令在 www.example.com/images 中看到我的 1000 张图片:

deny from all
allow from 127.0.0.1

但是,我想在 www.example.com 上使用这些图片,这样, <img src="images/thisimg.jpg" /> 有效。

我希望我的方向是正确的,但我感谢任何见解/重定向。这类似于:How to protect all directory contents, but gain access to php script 但我想链接到该目录中的这些图像,并且使用deny from all 不允许我这样做。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

在 .htaccess 中

Options -Indexes

http://httpd.apache.org/docs/current/mod/core.html#options

【讨论】:

这绝对是最好的答案。 您能进一步解释一下吗?我已经看到了链接,但无法弄清楚它的确切含义...... 这是错误的。如果域有一个没有文件扩展名的子页面怎么办?例如:example.com/about-us(将返回 404 错误) @HashanKanchana 你错了。您可能在 .htaccess 中设置了其他错误,例如干扰此行的 URL 重写。【参考方案2】:

您只需要在该文件夹中放置一个 index.php 或 .html 文件,就可以防止人们看到目录内容。对 yoursite.com/images 的任何请求都将加载 index.php,您将其设置为一个虚拟页面。

index.html 可能类似于:

<html><title>Forbidden!</title><body>Nothing to see here...</body></html>

或重定向脚本 index.php:

<?php header('Location: /index.php'); exit(); ?>

不要使用 .htaccess 来阻止目录列表,它会阻止对所有内容的访问。

【讨论】:

这是不正确的,应该在htaccess中完成。对于相同的结果,您可以覆盖在 apache/httpd 配置中列出的功能,但两者都不会阻止用户访问单个图像。使用此技术在网站上不正确地访问了无数图像和媒体。用户只需猜测文件名。 @Jason 就是这样......他不想阻止对图像的访问。他想链接到他页面上的图像以及用户能够加载它们。他只是想阻止目录列表。 我现在看到并没有完全理解他的问题。我对添加索引页面以“保护”某些东西的反应总是用火杀死它。但是,如果您的用户需要通过身份验证才能查看这些图像,我的回答仍然适用。谢谢@Fosco 好吧,我没有提到我也不希望这些图像被其他任何人使用。我放置了一个 htaccess 来防止盗链,但这并不能阻止任何人进入源代码并找到图像的路径,然后按照该链接指向图像。有什么建议吗? 你可以查看referrer,实现一些pass-thru hotlink检测脚本..很多东西。 .htaccess 可能会返回,您可以使用 .php 文件根据参数读取/输出图像。【参考方案3】:

选项 1(简单但不推荐)-

您不需要像这样创建 index 文件-

<html>
  <title>Forbidden!</title>
  <body>
    <h1>Access Denied !!</h1>
  </body>
</html>

并将其放置在您不想向用户显示的每个资源目录和目录中。

选项2(更可取)-

您可以在 .htaccess 文件的末尾添加它-

Options -Indexes

那么,你的.htaccess文件可能是这样的-

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %HTTP:Authorization .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

    Options -Indexes
</IfModule>

如果你这样做并尝试转到一个目录,你会得到类似的东西-


因此,没有人能够发现服务器中的任何目录。

更多内容请关注here

【讨论】:

我喜欢这个,因为它是用户反馈的最佳选择。禁止! 它在 .htaccess 中对我不起作用。似乎 .htaccess 对我的服务器没有影响。【参考方案4】:

最简单的解决方案:在您的图像文件夹中创建一个空白页面名称index.html :)

【讨论】:

这是一个快速破解 - 这背后的逻辑是什么? @SIslam 是的 - index.html 将是呈现给用户的页面,而不是目录内容的默认列表。如果它是空白的,用户将什么也看不到:)【参考方案5】:

在 .htaccess 文件中使用类似的东西:

 #
 ###################################################################
 ###                                                             ###
 ###                    Currently protection                     ###
 ###              images (jpg, jpeg, gif, png, bmp)              ###
 ###                       javascript (js)                       ###
 ###                Cascading Style Sheets (CSS)                 ###
 ###                                                             ###
 ###################################################################
 #
 <IfModule mod_rewrite.c>
 RewriteCond %HTTP_REFERER !^http://(www\.)?mysite.com/.*$ [NC]
 RewriteCond %HTTP_REFERER !^http://(www\.)?mysite.com$ [NC]
 RewriteRule .*\.(jpg|jpeg|gif|png|bmp|js|css)$ http://access-                    denied.us/hotlinks.html [NC,L]
 </ifModule>
 #

这将允许您的页面加载您想要的文档和图像,同时阻止其他所有人的页面这样做。我在我所有的网站上都使用它,效果很好。

【讨论】:

【参考方案6】:

deny from all 允许服务器端脚本使用文件,但限制完整的 Web 访问。

【讨论】:

【参考方案7】:

对我来说,我觉得完成它的最简单方法是使用重定向。在图像目录上,只需创建一个索引页面,然后在索引页面中,您可以重定向到您的站点索引页面,即

<?php
   header( 'Location: http://www.yoursite.com' ) ;
?>

因此,每当有人尝试直接访问图片页面时,他们最终都会进入您网站的根目录。

【讨论】:

【参考方案8】:

如果是我,我会确保引荐来源网址是 www.example.com,这是它的主要用途之一。

【讨论】:

你可以欺骗引荐来源网址,所以最终有人会找出这个漏洞。【参考方案9】:

Magicianeer 的建议最适合这个问题。如果您的图像被分成子文件夹,您必须在每个子文件夹中放置一个索引文件。 'Options -Indexes' 只需要在根目录执行一次。

【讨论】:

拒绝所有允许服务器端脚本使用的文件,但限制完整的 Web 访问。【参考方案10】:

在您要显示禁止访问的文件夹中 创建一个名为 index.php 的文件并粘贴此代码

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access This Folder
on this server.</p>
</body></html>

【讨论】:

【参考方案11】:

我使用了一个技巧,让人们认为他们访问了一个不存在的文件夹。

创建一个 HTML 文件并添加:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>

<body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>

</body>
</html>

【讨论】:

而且,一旦用户访问“不存在”的文件夹,我们将如何加载此页面?我不确定你的答案是否很清楚。

以上是关于使用 htaccess,如何限制查看目录内容,但允许服务器使用内容?的主要内容,如果未能解决你的问题,请参考以下文章

使用 htaccess 限制 IP

如何使用 .htaccess 指向目录以加载索引

如何应用份认证模块和.htaccess文件保证Web安全

使用 htaccess 进行 GZIP 压缩有啥限制吗?

如何使用 .htaccess 或 php.ini 增加上传文件大小限制? [复制]

如何使用 .htaccess 在除一个目录 /images 之外的所有 URL 上强制使用 HTTPS?