使用请求模块捕获无效的 url 预重定向

Catching invalid urls pre-redirection using the requests module

我有一个 nodejs 应用程序,用户可以在其中提供一个 url,它是一个外部 url,例如 www.google.com,或者一个指向 Web 应用程序页面之一的应用程序,例如A/B/C.aspx.

为了确保 url 有效,我一直在做:

const request = require("request");
request(url, (err, response) => {
    if (err || (response && response.statusCode !== 200)) {
        // not valid, though maybe I should be more lenient and allow codes < 400
    }
    else {
        // valid
    }
});

但是,我遇到了一个问题,即指向不存在的 webapp 页面的 url 会通过。我发现这是因为无效的 url 被重定向到有效的 url,并且 response.statusCode 被设置为 200。

为了解决这个问题,我通过将 url 参数替换为对象 {url: url, followRedirect: false} 来关闭重定向,但这只会导致 response.statusCode 被设置为 302。

我不仅希望它不重定向,而且我希望它验证提供的 url,以便在页面不存在时将 statusCode 设置为 404 t 发现而不是 302.

这可以做到吗?

我会尝试将我所有的评论汇总成一个答案,以尝试结束这个问题。

当您请求页面并且服务器响应 302 状态和重定向 URL 时,这可能意味着以下任何类型的事情:

  1. 而不是向您显示所请求的页面内容 URL,服务器希望您先转到另一个 URL(例如当您尚未登录时在)。登录后,URL 的请求很可能会向您显示常规内容。

  2. URL 的内容可能已暂时移至另一个 URL,因此服务器希望浏览器转到另一个 URL 并获取那里的内容。

  3. 服务器可能曾经支持 URL,但现在不再支持并且希望将浏览器发送到描述该问题的通用页面(技术上服务器可能应该使用 404为此,但并非所有人都会。

  4. 对于不受支持的 URL,实际上可能有一个包罗万象的处理程序,它们没有给您一个通用的 404 页面,而是将您重定向到网站上的其他地方。

当您返回 302 状态时,您无法知道它是哪一个。这完全取决于他们如何对他们的服务器进行编码,或者所有这些可能是什么。

因此,当您测试 URL 并返回 302 时,您只需做出自己的政策决定,决定如何表征该特定 URL。在那个时间点,URL 没有具体的页面内容。相反,它包含对另一个 URL 的引用。这是一个有效的服务器和请求 URL,您确实从服务器得到了有效的响应,但它只是对另一个 URL 的引用,而不是页面内容本身。

我认为你有四种一般情况需要处理:

  1. 您收到包含页面内容的 2xx 响应状态。我假设您想将其描述为有效的 URL.

  2. 您的响应状态为 400 或更高。我假设您想将其描述为无效的 URL.

  3. 您获得 3xx 的响应状态(如 302),它重定向到的 URL 为您提供包含页面内容的 2xx 响应状态。这是您自己的应用程序的政策决定,您希望如何描述它。如果不了解您的应用正在尝试执行的与表征 URL 相关的所有操作,我们无法在此处为您提供帮助。决定什么对您的应用最有利。

  4. 您得到 3xx 的响应状态(如 302),并且它重定向到的 URL 不会为您提供包含页面内容的 2xx 响应状态。我假设您希望将其归类为无效 URL。它生成了指向错误页面的引荐。

所以,在我看来,情况 1、2 和 4 非常清楚您希望如何处理它们。这只剩下第 3 种情况供您决定什么最适合您的应用。


看来您一开始就认为有一个 302 有页面内容,一个 302 没有页面内容,您不知何故想知道这两者之间的区别。事实并非如此。 302 表示现在此服务器不会为您提供任何 URL 的页面内容,而是希望您转到另一个 URL。你不知道为什么。你不知道这是否只是暂时的情况。您所知道的是,现在,服务器正在响应 URL,但正在向客户端推荐去其他地方,而不是直接从 URL.

提供内容

这有点像您在 phone 上给您的朋友打电话,您会收到一条录音消息,告诉您现在可以通过一个新的不同号码(类似于 302)联系到您的朋友。如果没有一些外部环境,您无法知道这只是暂时情况还是永久情况。而且,如果没有尝试使用新号码并成功联系到您的朋友,您甚至不知道新号码是否真的可以联系到您的朋友。