PHP/Windows Server/IIS 通过 PHP 通过符号 link 访问文件到另一台服务器上的文件夹

PHP/Windows Server/IIS Accessing file via PHP through symbolic link to folder on another server

美好的一天!我撞墙了。

我正在尝试让 PHP 从另一台服务器上的文件夹加载文件,并尝试了很多方法和权限的变体(IIS/PHP 使用 Windows 身份验证)但尚未找到解决方案。我离得很近,我可以尝到它。

文件在另一台服务器上的文件夹中,例如\otherServer\my_photos

为了访问它们,我在托管 PHP 站点的服务器上创建了一个符号 link,例如

C:\my_photos > \otherServer\my_photos

然后我正在做各种测试以确定该页面是否可以访问,例如:

$path = 'C:\my_photos'; 
$isReadable = is_readable($path);
var_dump($isReadable);

以上returnsTRUE.

但是,如果我这样做:

$path = 'C:\my_photos\photo_1.jpg'; 
$isReadable = is_readable($path);
var_dump($isReadable);

它returns FALSE.

文件 photo_1.jpg 的权限与文件夹 my_photos 相同,所以我怀疑原因是其他原因,例如影响其他服务器上文件访问的某种安全限制,但是我没主意了。我将以虚拟的感激之情回报任何帮助,甚至愿意为您画一张带有个人信息的照片。

更新: 如果我们关闭 Windows 身份验证并打开匿名身份验证(运行 在 ApplicationPoolIdentity 下)它可以工作,这似乎表明 a) 这不是一些令人困惑的跨服务器安全问题和 b) 问题可能与更多关于 PHP/fastCGI 模仿 Windows 用户的方式。将切换回 Windows 身份验证并继续测试!

我设法通过将 FastCGI 'protocol' 从 NamedPipe 更改为 TCP 来实现这一点(经过三天的绞尽脑汁),详见此答案:

我仍然不完全确定为什么会这样,但会继续寻找。最后不需要符号 link(或映射驱动器)——我们可以直接通过 UNC 路径访问远程文件。

您忘记对目录名前面的斜杠进行转义。它应该看起来像这样。

$path = 'C:\my_photos\photo_1.jpg'; 
$isReadable = is_readable($path);
var_dump($isReadable);

每个斜线都会被转义,因此,\otherServer\my_photos 将变为:

$path = '\\otherServer\my_photos';

请注意服务器名称前的 四个 斜杠和目录名称前的 两个 斜杠。