Известны два способа узнать существует ли удалённый файл средствами PHP: через функцию fopen (если файл открывается на чтение, то он существует) и через функцию get_headers($url) возвращающую при HTTP массив (при HTTPS и SSL ничего не возвращает), но при соединении по протоколу HTTPS они не работают. Перелопатил много сайтов – нашёл ответ на этом форуме: https://php.ru/forum/threads/https-i-php.18116/. Сначала при замене https:// на ssl:// работало, а потом никак. Я включил на следующий день (может КЭШ виноват) – опять не работает. Я при замене протокола, пробовал удачно узнать через функцию fopen, существует ли удалённый файл. Сейчас попробовал узнать через get_headers, как и при смене протокола выдаёт пустоту. Можно ли и как узнать, посредством PHP, что файл " https://fermers.ru/sites/default/files/Korovy/kor1.jpg " – есть ? P.S. Через функцию file_exists ($url), можно определить наличие файла, только когда определяемый файл находится на том же сервере, что и скрипт. P.P.S. cURL – на сервере нет. P.P.P.S. ПО на сервере за последний месяц точно не менялось. PHP: $Headers = @get_headers($url_s);//8 if(strpos('200', $Headers[0])) {//регистронезависимого аналога я не нашёл 4.9.18//5 echo "Файл '$url_s' существует, используя get_headers<br>"; echo 'print_r="';print_r ($Headers);echo '" ';//6 } else { echo "Файл '$url_s' не найден, используя get_headers<br>"; echo 'print_r="';print_r ($Headers);echo '" ';//6 } $url_s = 'ssl://im9.kommersant.ru/Issues.photo/NAUKA/2014/001/KMO_145468_00129_1_t218_162203.jpg';//https 2 if ($df=@fopen($url_s,"r")) {//ssl://fermers.ru/sites/default/files/Korovy/kor1.jpg ssl:// fclose ($df); echo "Файл '$url_s' существует, используя fopen<br>"; } else { echo "Файл '$url_s' не найден, используя fopen<br>"; }
я знаю, где ошибка здесь: соотв, тебе нужно понять, что 1. твои рассуждения завели тебя в тупик просто потому, что ты пошел не в том направлении 2. ненагуглилось ничего по той же причине 3. нужно понять, что не так, т.к. https от http в этом плане не отличается ничем 4. перестать юзать собак
Делись. Я полагаю, что ошибка элементарная, сразу ведь работало, к сожалению старый – работающий вариант не сохранился. Это комментарий от старой проблемы, сейчас только осталось: Ни как не могу я приплести сюда собаку
При убирании собак работает также, но появляется масса предупреждений, и я увидел в строке с @ ошибку об уже не использованной переменной. Буду в этом направлении рыть, ведь сначала работало. Результат будет – поделюсь.
QUOTE="igordata, post: 580664, member: 22934"]4. перестатьюзатьсобак[/QUOTE] Её я использовал, чтобы при отсутствии файла (штатная ситуация) не было остановки. Как я понял: что в строке с @ могут быть и другие ошибки, которые игнорируются.
@Pingvin1, проверяешь же-ж, используя get_headers(). Чего ещё желать? Про HTTPS: "...не является отдельным протоколом. Это обычный HTTP, работающий через шифрованные транспортные механизмы SSL и TLS." --- Добавлено --- Собственно, п.1 сообщения #2
Получил, что было раньше: причём, если файл при замене https:// на ssl:// без @, то синтаксическая ошибка, fopen без @ куча не подходящих сообщений и fopen при https:// ни чего не открывает, хотя картинка в браузере есть. Суть решения в том, что бы менять https:// на ssl://, сначала убрать ошибки без @ (работать не будет), а потом добавить @, подавить ошибки и изменить работу функции. Всем спасибо! --- Добавлено --- При проколе HTTPS он ничего не даёт (для http - массив).
Эта статья посвящена безопасности, пользуясь ей может так же потребовать танцев с бубном. Из указанной Вами документации fopen надо менять на fsockopen('ssl://' ...) и 443 порт. Только путь к файлу, если ULR начинается с https://, то на чтение файл не открывается, - значит не обычный и без выкрутасов файл не открывается. Не знаю, почему Вы сделали вывод, что через get_headers работает. Если путь начинается с https://, то get_headers возвращает пустой массив, а значит, не работает.
Как я прочитал на форуме: «функция get-headers не поддерживает HTTPS.», в https://translate.google.com/transl...p-how-get-headers-https-page.html&prev=search, а то я уж начал думать, что только у меня не работает по HTTPS. От себя я могу добавить, что и fopen обычно (как в HTTP) здесь не работает. И задача проверить наличие файла в HTTPS (а серверов на нём всё больше) не простая. Я убедился, что в этом топике обсуждается не элементарная задача.
@Pingvin1, сслыку на файл, приведённую в первом сообщении get_headers() отрабатывает у меня без всяких изысков. Но есть ещё вариант: PHP - Errors with get_headers and SSL (с отключением проверки сертификата).
В начале я хотел написать на сервере нет, а как его установить под ОС. А потом подумал, что раз у меня нет, то и у большинства пользователей нет, и это не подойдёт. Интересно! Буду проверять несколько дней, наверное, никто не опробует сам способ
Удивительно. Что ж ни у кого не работает? Так и хочется Вам простейшую программу прислать, что бы увидеть, что она выдаёт. У меня, как у всех HTTP работает, а HTTPS – нет. Может сборка как-то особо выполнена?
в документации тоже так написано? я просто спрашиваю. я не знаю. я не запоминаю. я всегда сверяюсь с документацией. Поэтому я советую тебе вчитаться в документацию по этой функции, и если там такого не написано, значит это неправда. --- Добавлено --- http://php.net/manual/en/function.get-headers.php http://www.php.net/manual/en/function.stream-context-create.php PHP: stream_context_set_default( [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]); $url = 'https://www.wikipedia.com'; // URL WITH HTTPS $headers = get_headers($url, 1); var_dump($headers); https://stackoverflow.com/questions/40830265/php-errors-with-get-headers-and-ssl --- Добавлено --- PHP: stream_context_set_default( [ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]); print_r(get_headers('https://200.35.78.130/')); https://stackoverflow.com/questions/37274206/get-headers-ssl-operation-failed-with-code-1 --- Добавлено --- контекст можно пихнуть в переменную, если нужно много разных контекстов, а не один глобальный дефолтный PHP: $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ], ]); $headers = get_headers('https://...', $context); или даже PHP: $headers = get_headers('https://...', stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]));