open_basedir不会让我写文件,但目录似乎正确吗?

时间:2010-10-25 17:39:40

标签: php iis fopen open-basedir

短篇小说:

我的php脚本中有一个open_basedir限制 - 一个简单的“测试将新文件写入磁盘”脚本。它让我觉得我的open_basedir设置正确,文件位于正确的位置 - 但没有运气,每次都是同样的错误。我在这个网站上搜索过类似的open_basedir问题,但是我没有看到任何这个问题 - 目录看起来正确但它仍然会引发错误。

我猜测问题是什么:
1)open_basedir不像我认为的那样工作 2)我的设置错了,我只是没有看到它 3)它实际上是其他东西,如IIS读/写权限等 4)???

长篇故事:

我正在使用PHP工作在IIS服务器上,我正在尝试使用以下代码片段(一个简单的写文件测试):

date_default_timezone_set('America/Chicago');
$myFile = 'testfile.txt';
$fh = fopen($myFile, 'w') or die("can't open file");
$stringData = "Some Text\n";
fwrite($fh, $stringData);
$stringData = "Some More Text\n";
fwrite($fh, $stringData);
fclose($fh);

这个php脚本位于我服务器上的C:\ inetpub \ wwwroot \ WEBDIRECTORY \ test_write.php

这是我对open_basedir的php.ini设置:
open_basedir = c:\ inetpub \ wwwroot; c:\ inetpub \ wwwroot \ WEBDIRECTORY

每当我打开脚本页面时,我都希望看不到输出,然后在我回来时应该在服务器上写一个新文件。这就是我得到的:

  

警告:fopen():open_basedir   限制有效。   文件(testfile.txt)不在   允许的路径:(c:\ inetpub \ wwwroot)   在   C:\的Inetpub \ wwwroot的\ WEBDIRECTORY \ test_write.php   第5行警告:   fopen(testfile.txt):无法打开   stream:不允许进行操作   C:\的Inetpub \ wwwroot的\ WEBDIRECTORY \ test_write.php   第5行无法打开文件

我尝试了很多排列:最初open_basedir线只是为了 open_basedir = c:\ inetpub \ wwwroot

......但这也行不通。

我也尝试输入testfile.txt(c:\ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.txt等)的绝对路径,而不仅仅是文件本身的名称,并且我不断收到相同的错误消息。

有什么想法吗?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

好的,很抱歉浪费每个人的时间 - 原来这是我的系统管理员为我设置的服务器设置。 (我是新手,所以我会用一般的术语解释我的理解)

他进行了设置,以便服务器无法解析网络目录中任何文件的地址,除了您希望在网站上找到的某些类型,例如.htm,.html,.php,.jpg,我试图阅读的文件是.txt。

所以,我写了一些测试代码:

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.php');
echo ("test = $test\n");
if($test == FALSE){
 echo ("... is FALSE\n");
}

$test = realpath('c:\inetpub\wwwroot\WEBDIRECTORY\testfile.txt');
echo ("test = $test\n");
if($test == FALSE){
 echo ("... is FALSE\n");
}

迅速退回了这个:

test = C:\ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.php
test = ...是FALSE

因此,realpath拒绝为以.txt结尾的任何内容返回地址,但非常乐意为.php文件执行此操作。这意味着WHENEVER我输入一个以非法扩展名结尾的其他合法(在basedir内)文件名,服务器将该地址解析为“C:\ inetpub \ wwwroot \ WEBDIRECTORY \ testfile.txt”,但为“”。当然,空字符串不会出现在basedir中,返回open_basedir限制错误。

BIZARRE!但现在我终于追溯到它的源头了。感谢所有的提示!它帮助我完成了消除过程并将其解决了。

答案 1 :(得分:-1)

这似乎是权限问题。检查C:\ inetpub \ wwwroot \ WEBDIRECTORY \上的权限。如果需要特殊权限,有时您必须更改执行写入的.PHP脚本的权限。通常,您需要目录和脚本集,而不仅仅是一个或另一个。

这是PHP手册中用于打开文件的好脚本:

$ filename ='test.txt'; $ somecontent =“将其添加到文件\ n”;

//让我们确保文件存在并且可以先写入。 if(is_writable($ filename)){

// In our example we're opening $filename in append mode.
// The file pointer is at the bottom of the file hence
// that's where $somecontent will go when we fwrite() it.
if (!$handle = fopen($filename, 'a')) {
     echo "Cannot open file ($filename)";
     exit;
}

// Write $somecontent to our opened file.
if (fwrite($handle, $somecontent) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}

echo "Success, wrote ($somecontent) to file ($filename)";

fclose($handle);

} else {     echo“文件$ filename不可写”; }