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';
请注意服务器名称前的 四个 斜杠和目录名称前的 两个 斜杠。
美好的一天!我撞墙了。
我正在尝试让 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';
请注意服务器名称前的 四个 斜杠和目录名称前的 两个 斜杠。