PHP/Windows Server/IIS Доступ к файлу через PHP через символическую ссылку на папку на другом сервере

Добрый день! Я ударился о стену.

Я пытаюсь заставить PHP загрузить файл из папки на другом сервере и перепробовал так много методов и вариантов разрешений (IIS/PHP используют проверку подлинности Windows), но еще не нашел решения. Я так близко, что чувствую вкус.

Файлы находятся в папке на другом сервере, например. \\otherServer\my_photos

Чтобы получить к ним доступ, я создал символическую ссылку на сервере, на котором размещен сайт PHP, например.

C:\my_photos > \\otherServer\my_photos

Затем я выполняю различные тесты, чтобы определить, есть ли доступ к странице, например:

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

Приведенное выше возвращает TRUE.

Однако, если я сделаю это:

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

Он возвращает FALSE.

Разрешения для файла photo_1.jpg идентичны разрешениям для папки my_photos, поэтому я подозреваю, что причина в чем-то другом, например, в каком-то ограничении безопасности, влияющем на доступ к файлам на других серверах, но у меня нет идей. Я вознагражу любую помощь виртуальной благодарностью и даже готов нарисовать вам картинку с личным сообщением.

ОБНОВЛЕНИЕ: если мы выключим аутентификацию Windows и включим анонимную аутентификацию (работающую под ApplicationPoolIdentity), она будет работать, что, по-видимому, предполагает, что а) это не какая-то запутанная проблема межсерверной безопасности и б) проблема может больше относятся к тому, как PHP/fastCGI выдает себя за пользователей Windows. Вернемся к аутентификации Windows и продолжим тестирование!


person valoukh    schedule 06.10.2017    source источник
comment
Можете ли вы открыть изображение из командной строки или средства просмотра изображений? Решите это сначала, если нет.   -  person Nic3500    schedule 06.10.2017
comment
Разве вы не можете иметь веб-сервер на другом сервере? Жизнь намного проще, когда задействован только HTTP   -  person icc97    schedule 06.10.2017
comment
Почему бы не сопоставить \\otherServer\my_photos с буквой диска на сервере? Вероятно, лучше, чем символические ссылки. Но также у вас должны быть правильные разрешения для всех файлов, а не только для самой папки. Они не обязательно одинаковы. Как правило, разрешение должно быть предоставлено учетной записи, под которой работает приложение, а не учетной записи пользователя, обращающегося к ресурсу, если только вы не пытаетесь использовать какую-либо сквозную аутентификацию.   -  person ADyson    schedule 06.10.2017


Ответы (2)


Мне удалось заставить это работать (после трех дней головокружения), изменив «протокол» FastCGI с NamedPipe на TCP, как подробно описано в этом ответе:

https://stackoverflow.com/a/41367358/1358231

Я все еще не совсем уверен, почему это работает, но буду продолжать искать. В конце концов отпала необходимость в символической ссылке (или подключенном диске) — мы могли получить доступ к удаленному файлу напрямую через путь UNC.

person valoukh    schedule 09.10.2017

Вы забыли экранировать косую черту перед именем каталога. Это должно выглядеть так.

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

Каждая косая черта экранируется, поэтому \otherServer\my_photos станет:

$path = '\\\\otherServer\\my_photos';

Обратите внимание на четыре косые черты перед именем сервера и две косые черты перед именем каталога.

person Robert Mauro    schedule 14.04.2020