Убедитесь, что URL указывает на реальное местоположение?

#php #url #exists

#php #url #существует

Вопрос:

Я запустил эту маленькую CMS-штуку, и у пользователя есть возможность просмотреть сообщение перед отправкой. Я хотел бы иметь функцию, которая проверяет, является ли введенный URL допустимым (т.е. указывает на существующий ресурс, а не на то, в правильном формате он или нет). Предпочтительно, я хотел бы сделать это с помощью JavaScript (тогда мне не нужно использовать AJAX и PHP), но PHP в порядке.

Может ли кто-нибудь указать мне способ сделать это? На всякий случай, я хочу получить ответ «да» / «нет» от чего-то вроде выполнения команды UNIX ping . Меня не волнует, что находится на другом конце URL, просто указывает ли он на что-то доступное для навигации.

Спасибо,

Джеймс

Комментарии:

1. Используйте cURL для отправки запроса HEAD. Вам нужно будет установить агрессивные тайм-ауты.

Ответ №1:

вы могли бы просто использовать fopen, чтобы посмотреть, будет ли URL работать … конечно, это может быть излишним ресурсом, в зависимости от того, как часто вы это делаете.

http://php.net/manual/en/function.fopen.php

В качестве альтернативы вы можете использовать плагин jquery:

http://binarykitten.me.uk/dev/jq-plugins/88-jquery-plugin-ajax-head-request.html

Альтернативный и, вероятно, самый простой способ, который не является живым … но вы можете использовать jquery для вызова другого php-скрипта, который его реализует:

http://php.net/manual/en/function.get-headers.php

Комментарии:

1. Спасибо за ответ sdolgy. Я выбрал путь jQuery, но не могли бы вы рассказать мне, как я могу заставить этот плагин возвращать значение true / false, чтобы я мог выбирать, отображать сообщение или нет? Большое спасибо.

2. если вы выполните итерацию по заголовкам и посмотрите на конкретный код состояния http 200 = OK, 304 = cached и т.д. вот список кодов: en.wikipedia.org/wiki/List_of_HTTP_status_codes

3. Спасибо за это, однако, единственные заголовки, которые я получил, были возвращены, где эти: Дата: —: Чт, 21 Апр 2011 20:33:09 GMT Сервер: —: Apache / 2.2.17 (Ubuntu) Срок действия X-Powered-By:—: PHP / 5.3.5-1ubuntu7 истекает: —: Чт, 19 ноября 1981 г. 08:52:00 GMT Cache-Control: —: нет хранилища, нет кэша, необходимо повторно проверять, post-check = 0, предварительная проверка = 0 Pragma: —: no-cache Меняется: —:Accept-Encoding Content-Encoding:—: длина содержимого gzip:—: 2860 Keep-Alive:—: тайм-аут= 15, макс = 95 Подключение :—:Поддерживаемый тип содержимого:—:текст / html Пожалуйста, извините за отсутствие разрывов строк 🙁

4. нет проблем. попробуйте местоположение, которое не существует. сравните различия? это должна быть первая строка в заголовке ответа. web-sniffer.net ..

5. Кстати, статус заголовка ниже 399 обычно является хорошим показателем, поэтому ваш код будет выглядеть следующим образом: if(status>399)alert("error"); .

Ответ №2:

Загрузите его в новый img объект и посмотрите, каков ответ. Поскольку вы на самом деле не отображаете изображение, тот факт, что вы можете загружать обычный текст или другие данные, не относящиеся к изображению, в основном не имеет значения, вы просто хотите посмотреть, каков код состояния HTTP для запроса изображения.

Преимущество заключается в том, что если злоумышленник попытается загрузить URL-адрес, который указывает на неприлично большой файл, он только отключит себя, поскольку запрос будет отправлен из их браузера, а не с вашего сервера. С другой стороны, ничто не помешает им подделать правильный ответ и все равно вставить этот ресурс большого размера и отправить форму в любом случае.