С помощью Node.js и как мне определить, активна ли HTTP-версия сайта, когда она всегда возвращает response.ok = true?

#node.js #fetch

#node.js #выборка

Вопрос:

Среда: Node.js , Экспресс, выборка узлов

Вопрос: Я пытаюсь использовать выборку узла, чтобы определить, активен ли веб-сайт. Это отлично работает для https. Однако, когда я тестирую http, он всегда возвращается как ok = true , status = 200 amp; statusText = OK . Даже когда я использую случайные символы и буквы для URL-адреса, такие как qwerweqr12341243124.net это всегда возвращается одним и тем же путем. Есть ли лучший способ использовать выборку, чтобы определить, активна ли http-версия? Требуется ли другой инструмент?

Пример: Приведенный ниже упрощенный пример проверяет, есть ли активная http и https версия веб-сайта.

 const fetch = require('node-fetch');

function checkIfWebsiteExists(website) {

    let httpVersion = `http://${ website }`;
    let httpsVersion = `https://${ website }`;

    fetch(httpVersion)
        .then(function(response) {
            console.log('http ok', response.ok);
            console.log('http status', response.status);
            console.log('http statusText', response.statusText);
        })
        .catch(function(err) {
            console.log(err);
        });

    fetch(httpsVersion)
        .then(function(response) {
            console.log('https ok', response.ok);
            console.log('https status', response.status);
            console.log('https statusText', response.statusText);
        })
        .catch(function(err) {
            console.log(err);
        }); 
}
  

Ответ №1:

Итак, выборка узла по умолчанию будет автоматически следовать перенаправлениям. Итак, если http-версия сайта выполняет перенаправление на https-версию сайта, то node-fetch автоматически последует за этим перенаправлением и в конечном итоге предоставит вам содержимое с https-версии сайта (не сообщая вам об этом).

Если вы не хотите автоматически следовать перенаправлению, чтобы вы могли видеть реальный статус http, возвращаемый с http версии сайта, добавьте эту опцию в свой вызов node-fetch:

 fetch(httpVersion, { redirect: 'manual' })
  

Затем, когда вы запускаете свой код на сайте, который выполняет автоматическое перенаправление, например www.stackoverflow.com , вы получите статус 301 для http-версии запроса.

 http ok false
http status 301
http statusText Moved Permanently
  

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

1. Привет, jfriend00, интересно, что помогает. Но одна проблема, с которой я сталкиваюсь, заключается в том, что даже URL-адрес случайного символа, такой как fdsaf54rsafrsadfasfd.net возвращается ok = true , status = 200 amp; statusText = OK когда я тестирую http. Есть ли лучший тест?

2. @myNewAccount — это полностью зависит от того, что сервер сайта делает для несуществующего URL. Некоторые сайты, полностью предназначенные для браузера, могут возвращать 200 и веб-страницу для несуществующего URL. Предоставьте пример URL-адреса, и я могу взглянуть на него.

3. Я тестирую введенные пользователем URL-адреса. Вот почему я тестировал сумасшедшие примеры, такие как, dfyuifioads123fsadfsadfsadf4e.com . Но http независимо от того, что я пытаюсь, они всегда возвращаются хорошо. Я проверяю, есть ли заголовок, который указывает, что сайт не является реальным, но я ничего не могу найти. Есть ли волшебная палочка для такого рода вещей?

4. @myNewAccount — это на объекте ошибки, отправленном .catch() . Возвращаемое обещание fetch() отклоняется.

5. Да, это ПЛОХОЙ ПРОВАЙДЕР. Позор вам, провайдер. Прекратите это делать. Они пытаются продавать рекламу по неверному URL. Вы можете сменить свой DNS-сервер на общедоступный DNS-сервер (например, Google или один из других бесплатных, общедоступных и хороших), который этого не сделает.