Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 避免通过htaccess直接访问服务器上目录中的图像?_.htaccess - Fatal编程技术网

.htaccess 避免通过htaccess直接访问服务器上目录中的图像?

.htaccess 避免通过htaccess直接访问服务器上目录中的图像?,.htaccess,.htaccess,我希望避免直接访问目录中的图像。请让我解释一下我到底需要什么,因为它有点复杂;) 我有一个名为“member”的目录,在这个目录中有像“thorsten”这样的成员目录,在这个目录中有成员的图像。我的天,它看起来像这样: index.php // The index.php is in the same directory as the member directory ;) member/thorsten/Thorsten-fTeVtE-Preview-01.jpg

我希望避免直接访问目录中的图像。请让我解释一下我到底需要什么,因为它有点复杂;)

我有一个名为“member”的目录,在这个目录中有像“thorsten”这样的成员目录,在这个目录中有成员的图像。我的天,它看起来像这样:

    index.php // The index.php is in the same directory as the member directory ;)

    member/thorsten/Thorsten-fTeVtE-Preview-01.jpg
    member/thorsten/Thorsten-gZ4Cd3-01.jpg

    .htaccess // The .htaccess should be here too :)
正如您所看到的,成员thorsten现在有两个图像,一个有单词“Preview”,另一个没有。我需要的是,我不允许通过url直接访问文件名中没有“预览”一词的所有图像

另一个棘手的部分是,像本例中的“thorsten”这样的用户目录可以有任何名称,例如:

    member/melanie/Melanie-fh3wxcg-Preview-01.jpg

    or

    member/conny/Conny-fh3wxcg-Preview-01.jpg
我希望您理解我的确切意思,成员目录名称应该是可变的;)


谢谢:)

有两种方法可以做到这一点

方法1 当您拒绝访问时,即使您无法通过网页访问它

步骤1:阻止访问mysite.com/member/

在文件夹成员中,创建新的.htaccess文件并添加以下行:

Order Deny,Allow
Deny from all
第2步:为自己设置另一种访问文件的方式

在文件夹成员中创建文件get_image.php并添加以下代码:

if( !empty( $_GET['name'] ) )
{
    $img_name = preg_replace( '#[^-\w]#', '', $_GET['name'] );
    $img_file = "{$_SERVER['DOCUMENT_ROOT']}/member/{$img_name}";
    if( file_exists( $img_file ) )
    {
      header( 'Cache-Control: public' );
      header( 'Content-Description: File Transfer' );
      header( "Content-Disposition: attachment; filename={$img_file}" );
      header( 'Content-Type: image/jpeg' );
      header( 'Content-Transfer-Encoding: binary' );
      readfile( $song_file );
      exit;
    }
}
现在,您可以使用此URL获取歌曲文件:

方法2有选择地阻止访问

在htaccess中使用Regex

.*?Preview.*?\.jpg
类似的东西(除了我的正则表达式可能是错误的)


命令拒绝,允许
全盘否定
允许来自环境=重定向\u状态

或者您也可以这样做:

<Directory /your/www/root>
  <FilesMatch "^member/$">
    Order Deny,Allow
    Deny from All
  </FilesMatch>
  <FilesMatch "^member/?preview?$">
    Order Allow,Deny
    Allow from All
  </FilesMatch>
</Directory>
命令拒绝,允许 全盘否定 命令允许,拒绝 通融

如果您的目标是使非预览图像仅通过应用程序可用,那么我建议将它们移动到另一个目录,即文档根目录之外的目录。这是一个好主意,但我需要这个目录顺序,因为我只想阻止通过链接访问非“预览”图像;)谢谢:)你不必把它们都放在同一个目录中……我知道,但在这种情况下,我需要这样做;)谢谢:)嗨:)我稍后会试试这个谢谢:)但是我需要访问我自己网站上的图片,你的配置可以吗?我只想避免访问直接链接,我想防止其他人从我的服务器在其网站上显示图像;)谢谢:)如果你能解释一下你的代码,让我知道它的具体功能,这样我就能理解它了,那也太好了。谢谢:)@Thorsten第一个家伙,“FilesMatch”阻止对给定路径上所有文件的访问(如上面所说的“拒绝所有文件”),除了那些名称中有“preview”的文件。第二个也一样,但它拒绝对“member”下所有dir的目录访问,除了名称中有“preview”的文件(filematch设置为“Allow from all”)嗨,我现在已经测试了这两个文件。第一个不起作用,可能是因为正则表达式是错误的?从第二个开始,我得到一个内部服务器错误。我已经输入了我的文档根目录,但仍然收到错误。你知道我做错了什么,或者可能做错什么吗?谢谢:).?\.jpg将匹配所有图像文件。您可以将不带预览的文件所需的条件应用于所有图像,然后添加另一行,将带预览的文件的条件应用于文件名中带“预览”的图像。这将覆盖文件名中带有“preview”的图像的条件,并保持没有预览的文件的原始条件不变。文件名中没有“preview”一词的所有jpg文件的正则表达式是什么?使用“?\.jpg”我选择了所有jpg图像,但我需要获得所有图像,但不包括带有“preview”一词的图像在文件名中。
<Directory /your/www/root>
  <FilesMatch "^member/$">
    Order Deny,Allow
    Deny from All
  </FilesMatch>
  <FilesMatch "^member/?preview?$">
    Order Allow,Deny
    Allow from All
  </FilesMatch>
</Directory>