За последние 24 часа нас посетили 110289 программистов и 7637 роботов. Сейчас ищут 1949 программистов ...

Определение существования удалённого файла по протоколу HTTPS

Тема в разделе "PHP для новичков", создана пользователем Pingvin1, 5 сен 2018.

  1. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Известны два способа узнать существует ли удалённый файл средствами 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:
    1.  $Headers = @get_headers($url_s);//8
    2. if(strpos('200', $Headers[0])) {//регистронезависимого аналога я не нашёл 4.9.18//5
    3.    echo "Файл '$url_s' существует, используя get_headers<br>";
    4.    echo 'print_r="';print_r ($Headers);echo '" ';//6
    5. } else {
    6.   echo "Файл '$url_s' не найден, используя get_headers<br>";
    7.    echo 'print_r="';print_r ($Headers);echo '" ';//6
    8. }
    9.  
    10.  
    11.    $url_s = 'ssl://im9.kommersant.ru/Issues.photo/NAUKA/2014/001/KMO_145468_00129_1_t218_162203.jpg';//https 2
    12. if ($df=@fopen($url_s,"r")) {//ssl://fermers.ru/sites/default/files/Korovy/kor1.jpg ssl://
    13.   fclose ($df);
    14.    echo "Файл '$url_s' существует, используя fopen<br>";
    15. } else {
    16.   echo "Файл '$url_s' не найден, используя fopen<br>";
    17. }
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    я знаю, где ошибка
    здесь:

    соотв, тебе нужно понять, что
    1. твои рассуждения завели тебя в тупик просто потому, что ты пошел не в том направлении
    2. ненагуглилось ничего по той же причине
    3. нужно понять, что не так, т.к. https от http в этом плане не отличается ничем
    4. перестать юзать собак
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    stripos() - Возвращает позицию первого вхождения подстроки без учета регистра
     
  4. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Делись.

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

    Это комментарий от старой проблемы, сейчас только осталось:

    Ни как не могу я приплести сюда собаку :)
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @ - это собака. Убери их из кода.
     
  6. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    При убирании собак работает также, но появляется масса предупреждений, и я увидел в строке с @ ошибку об уже не использованной переменной. Буду в этом направлении рыть, ведь сначала работало. Результат будет – поделюсь.
     
  7. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    QUOTE="igordata, post: 580664, member: 22934"]4. перестатьюзатьсобак[/QUOTE]

    Её я использовал, чтобы при отсутствии файла (штатная ситуация) не было остановки.

    Как я понял: что в строке с @ могут быть и другие ошибки, которые игнорируются.
     
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    такие вещи надо обрабатывать, для этого есть https://php.ru/manual/function.file-exists.html
     
  9. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Как я писал в этом топике:

    По крайней мере в версии PHP 5.3.13 это так.
     
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @Pingvin1, сорь уже забыл чё там было в начале. Значит у вас там безопасный режим включен.
     
  11. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    По умолчанию. Я полагаю, что file_exists нельзя использовать, раз у многих он не работает.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    тебе надо начать заново
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Pingvin1, проверяешь же-ж, используя get_headers(). Чего ещё желать?
    Про HTTPS: "...не является отдельным протоколом. Это обычный HTTP, работающий через шифрованные транспортные механизмы SSL и TLS."
    --- Добавлено ---
    Собственно, п.1 сообщения #2
     
  14. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Получил, что было раньше: причём, если файл при замене https:// на ssl:// без @, то синтаксическая ошибка, fopen без @ куча не подходящих сообщений и fopen при https:// ни чего не открывает, хотя картинка в браузере есть.

    Суть решения в том, что бы менять https:// на ssl://, сначала убрать ошибки без @ (работать не будет), а потом добавить @, подавить ошибки и изменить работу функции. Всем спасибо!
    --- Добавлено ---
    При проколе HTTPS он ничего не даёт (для http - массив).
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Pingvin1, глянь пример 2 из мануала. (На предмет HEAD - запроса, а не http, что там прописан в url)
     
  16. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Эта статья посвящена безопасности, пользуясь ей может так же потребовать танцев с бубном.

    Из указанной Вами документации fopen надо менять на fsockopen('ssl://' ...) и 443 порт.

    Только путь к файлу, если ULR начинается с https://, то на чтение файл не открывается, - значит не обычный и без выкрутасов файл не открывается.

    Не знаю, почему Вы сделали вывод, что через get_headers работает. Если путь начинается с https://, то get_headers возвращает пустой массив, а значит, не работает.
     
    #16 Pingvin1, 6 сен 2018
    Последнее редактирование: 6 сен 2018
  17. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Где-то что-то не так делаете... :rolleyes:
     
  18. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Как я прочитал на форуме: «функция get-headers не поддерживает HTTPS.», в https://translate.google.com/transl...p-how-get-headers-https-page.html&prev=search, а то я уж начал думать, что только у меня не работает по HTTPS. От себя я могу добавить, что и fopen обычно (как в HTTP) здесь не работает.

    И задача проверить наличие файла в HTTPS (а серверов на нём всё больше) не простая.

    Я убедился, что в этом топике обсуждается не элементарная задача.
     
  19. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Курла нету для php или и ОС тоже?
     
  20. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Pingvin1, сслыку на файл, приведённую в первом сообщении get_headers() отрабатывает у меня без всяких изысков.
    Но есть ещё вариант: PHP - Errors with get_headers and SSL (с отключением проверки сертификата).
     
    Pingvin1 нравится это.
  21. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    В начале я хотел написать на сервере нет, а как его установить под ОС.

    А потом подумал, что раз у меня нет, то и у большинства пользователей нет, и это не подойдёт.

    Интересно!
    Буду проверять несколько дней, наверное, никто не опробует сам способ :(
     
    #21 Pingvin1, 7 сен 2018
    Последнее редактирование: 7 сен 2018
  22. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Причём тут пользователи и серверные скрипты? ОС какая?
     
  23. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Нет в обоих случаях.

    Вин 8.1
     
  24. Pingvin1

    Pingvin1 Новичок

    С нами с:
    3 сен 2018
    Сообщения:
    20
    Симпатии:
    1
    Удивительно. Что ж ни у кого не работает? Так и хочется Вам простейшую программу прислать, что бы увидеть, что она выдаёт. У меня, как у всех HTTP работает, а HTTPS – нет. Может сборка как-то особо выполнена?
     
    #24 Pingvin1, 7 сен 2018
    Последнее редактирование: 7 сен 2018
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.333
    Симпатии:
    1.753
    в документации тоже так написано? я просто спрашиваю. я не знаю. я не запоминаю. я всегда сверяюсь с документацией.
    Поэтому я советую тебе вчитаться в документацию по этой функции, и если там такого не написано, значит это неправда.
    --- Добавлено ---
    http://php.net/manual/en/function.get-headers.php

    http://www.php.net/manual/en/function.stream-context-create.php

    PHP:
    1.     'ssl' => [
    2.         'verify_peer' => false,
    3.         'verify_peer_name' => false,
    4.     ],
    5. ]);
    6.  
    7. $url = 'https://www.wikipedia.com';  // URL WITH HTTPS
    8.  
    9. $headers = get_headers($url, 1);
    10.  
    11. var_dump($headers);
    https://stackoverflow.com/questions/40830265/php-errors-with-get-headers-and-ssl
    --- Добавлено ---
    PHP:
    1.     'ssl' => [
    2.         'verify_peer' => false,
    3.         'verify_peer_name' => false,
    4.     ],
    5. ]);
    6.  
    7. print_r(get_headers('https://200.35.78.130/'));
    https://stackoverflow.com/questions/37274206/get-headers-ssl-operation-failed-with-code-1
    --- Добавлено ---
    контекст можно пихнуть в переменную, если нужно много разных контекстов, а не один глобальный дефолтный
    PHP:
    1.     'ssl' => [
    2.         'verify_peer' => false,
    3.         'verify_peer_name' => false,
    4.     ],
    5. ]);
    6. $headers = get_headers('https://...', $context);
    или даже
    PHP:
    1. $headers = get_headers('https://...', stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]));
     
    Pingvin1 нравится это.