【问题标题】:Using htaccess, how to restrict seeing directory contents, but allow server to use the contents?使用 htaccess,如何限制查看目录内容,但允许服务器使用内容?
【发布时间】: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 不允许我这样做。

提前感谢您的帮助。

【问题讨论】:

    标签: php .htaccess


    【解决方案1】:

    【讨论】:

    • 这绝对是最好的答案。
    • 您能进一步解释一下吗?我已经看到了链接,但无法弄清楚它的确切含义......
    • 这是错误的。如果域有一个没有文件扩展名的子页面怎么办?例如: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>

            【讨论】:

            • 而且,一旦用户访问“不存在”的文件夹,我们将如何加载此页面?我不确定你的答案是否很清楚。
            猜你喜欢
            • 2018-04-19
            • 2017-03-21
            • 1970-01-01
            • 1970-01-01
            • 2013-04-02
            • 2018-04-13
            • 2022-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多