Как проверить доступность внешнего сайта на JavaScript

upload successful

Не так давно я столкнулся с проблемой проверки доступности внешнего ресурса средствами javaScript.

Работа с другими серверами в javascript возможна только при наличии соответствующего заголовка у стороннего сервера: Access-Control-Allow-Origin
В противном случае все наши попытки достучаться до другого сайта будут заканчиваться ошибкой, не зависимо от того, доступен он или нет.

Задача: необходимо понимать, в какой сети мы находимся (в локальной сети со своим DNS, или работаем, например, из дома).

Как понять, доступен ли ресурс, средствами javaScript?

Решение задачи следующее:

Находим любой доступный из локальной сети внутренний ресурс (например локальный сайт или вики), находим на нём любую рабочую картинку (чем меньше, тем лучше);

Замечу, что это решение можно применять и для проверки доступности любых сайтов. Или даже определённых страниц, при условии что на них размещено уникальное изображение. Способ может некорректно работать в старых FireFox.

Выберем ресурс, доступность которого необходимо определить:

Например: portal.loc

Наше изображение: portal.loc/favicon.png

Имеем следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function setServerStatus(status) {
console.log(status);
}
function checkServerStatus()
{
setServerStatus("unknown");
var img = document.body.appendChild(document.createElement("img"));
img.onload = function()
{
setServerStatus("online");
};
img.onerror = function()
{
setServerStatus("offline");
};
img.src = "http://portal.loc/favicon.png";
}

Функция checkServerStatus создаёт DOM элемент, с тегом img, и на состояние загрузки этого изображения мы назначаем некоторые события, в нашем случае: setServerStatus(online/offline).

Если картинку удалось загрузить (если мы находимся в рамках локальной сети со своим DNS сервером, то результат будет “success”, соответственно, мы можем понять в какой сети мы находимся, так как при попытки загрузки изображения из внешней сети эта операция завершится со статусом “error”.