由于 htaccess 限制,PHP fopen() 和 is_file() 无法正常工作

Posted

技术标签:

【中文标题】由于 htaccess 限制,PHP fopen() 和 is_file() 无法正常工作【英文标题】:PHP fopen() and is_file() not working because of htaccess restrictions 【发布时间】:2012-05-20 19:27:17 【问题描述】:

我会尽力解释这一点。我正在开发一个会员驱动的网站,会员可以上传文件进行销售(他们拥有这些文件的权利)。

前提 1:我想确保不能直接访问每个成员的文件夹,只能通过网站本身的链接访问。

此链接仅在购买者的会员区生成(用于多次下载文件......并且会员资料也不允许链接到这些文件夹)。

因此,每次成员加入时,他们都会获得一个文件,其中会自动创建一个 .htaccess。

RewriteEngine on
RewriteCond %HTTP_REFERER !^http://(www\.)?domain.com/.*$ [NC]
RewriteRule .* - [F]

前提 2:当用户上传文件时,该过程的最后一步是确保文件确实已上传。

$uploadFullPath = 'http://www.domain.com/userfiles/'.$_SESSION['uniqueKey'].'/'.$_SESSION['userNumber'].'-'.$_SESSION['latestUpload'].'.'.$_SESSION['latestExt'];
 if(fopen($uploadFullPath,"r")!==0)
  // update member usages
  $query = "UPDATE memberUsage SET usageLicenses=usageLicenses+1 WHERE memberNumber=".$_SESSION['userNumber'];
  mysql_query($query) or die(reportError('Unable to increment licenses used'));
  echo 'Your file has been successfully updated. You can view your listing within <a href="/user-area/">Your Dashboard</a>';

else
 echo 'There seems to have been a problem uploading your file. Please <a href="/user-area/">go back</a> and try again from your \'incomplete listings\' page. Upload Path Provided: <a href="' . $uploadFullPath .'">' . $uploadFullPath . '</a>';

为了清楚起见,reportError() 函数只是一个预加载的函数,它会在需要报告错误的任何时候生成 mysql_error() 和 mysql_errno(),以节省每次输入的时间。

在上面我使用 fopen() 的地方,我还尝试使用 is_file() 和 file_exists() 测试文件是否存在。

问题 上面的 htaccess 限制 fopen()、is_file() 和 file_exists() 都找不到文件,即使点击生成的 $uploadFullPath 也可以。

但是,如果我删除 htaccess 限制,上述功能仍然有效,但同样可以直接访问文件,而无需先购买或通过网站。

请问如何让这两个条件同时运行?我不确定它是否只是 htaccess,只是我的文件检测方法或两者的组合。

提前感谢您的帮助!

【问题讨论】:

您不能只使用本地文件系统的路径打开文件吗?(例如/var/www/mysite/userfiles/more/stuff/here)?这不会触发 httpd,因此不会触发 .htaccess 文件。还是您的文件在远程服务器上? 我们谈论的是“实时”网站上的站点,而不是本地计算机。这有什么不同吗? 一点也不,直接打开它而不是通过 http://-wrapper 实际上更容易(在资源方面),因为你不必通过你的 httpd 加倍努力。如果您知道文件所在的路径(并且对这些文件具有读取权限),则可以直接在这些文件上使用 file_existsfopen 好的,从您的第一个回复来看,这不会触发 htaccess 违规问题? 是的,因为如果只是 httpd 使用 htaccess。 【参考方案1】:

如果可能,请使用本地文件系统而不是 http://-wrapper。

因此,例如,如果您的 php 文件是 /var/www/kirby/myfile.php,并且您的上传文件存储在(再次作为示例)/var/www/kirby/useruploads/cooluserone/test.jpg(假设 test.jpg 作为上传文件)。

在这种情况下,您可以使用相对路径 file_exists("useruploads/cooluserone/test.jpg") 或完整路径 file_exists("/var/www/kirby/useruploads/cooluserone/test.jpg")

这两个都将返回 true。

您必须确保您对文件夹/文件具有读取权限,您可能已经拥有这些权限。

【讨论】:

谢谢 - 现在看来确实有效,使用文件路径而不执行 http 请求。谢谢!

以上是关于由于 htaccess 限制,PHP fopen() 和 is_file() 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在.htaccess中设置PHP内存限制

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

.Htaccess设置以增加php和html文件的内存限制。

Drupal htaccess phpu值(增加限制)

如何在.htaccess文件中设置PHP最大执行时间和脚本内存限制

如何在.htaccess文件中设置PHP最大执行时间和脚本内存限制