使用请求模块捕获无效的URL前重定向

时间:2017-07-19 22:16:48

标签: node.js url npm-request

我有一个nodejs应用,其中用户可以提供外部网址的网址,例如www.google.com,或指向其中一个网页应用页面的网址,例如A / B / C. ASPX。

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

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会通过。我发现,这是因为无效的网址被重定向到有效的网址,response.statusCode被设置为200。

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

我不仅希望它不重定向,而且我希望它验证提供的网址,以便statusCode设置为404如果找不到网页而不是到302

可以这样做吗?

1 个答案:

答案 0 :(得分:1)

我会尝试将所有评论都推到答案中,试图结束这个问题。

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

  1. 服务器不是在请求的URL上显示页面内容,而是希望您首先转到此其他URL(例如,当您尚未登录时)。登录后,对该URL的请求可能会向您显示常规内容。

  2. 该网址的内容可能已暂时移至其他网址,因此服务器希望浏览器转到其他网址并在那里获取内容。

  3. 服务器可能曾经支持过该URL,但现在不再需要并希望将浏览器发送到描述该问题的通用页面(从技术上讲,服务器可能应该为此使用404,但不是全部。

  4. 实际上可能有不受支持的URL的全能处理程序,而不是给你一个通用的404页面,他们会将你重定向到网站上的其他地方。

  5. 当你获得302状态时,你无法知道它是哪一个。这完全取决于他们如何编写服务器的所有或所有这些服务器。

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

    我认为你有四个一般案例需要处理:

    1. 您获得了包含网页内容的2xx响应状态。我假设你想把它描述为一个有效的URL。

    2. 您的响应状态为400或更高。我假设你想把它描述为非有效的URL。

    3. 您的响应状态为3xx(如302),并且重定向到的URL会为您提供包含页面内容的2xx响应状态。这是您自己的应用程序的策略决策,您希望如何表征它。如果不了解您的应用尝试执行的与表征网址相关的所有内容,我们无法帮助您。确定哪些内容符合您应用的最佳利益。

    4. 您的响应状态为3xx(如302),并且重定向到的URL不会为您提供包含页面内容的2xx响应状态。我假设你想把它归类为非有效的URL。它生成了对坏页面的引用。

    5. 所以,在我看来,情况1,2和4非常清楚你将如何处理它们。只留下案例#3让您决定什么是最适合您的应用。

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

      有点像你打电话给你的朋友,你得到一条录音信息,现在你的朋友可以通过一个新的不同号码(就像302)来联系。如果没有一些外部环境,您无法知道这只是一个临时条件还是永久性条件。并且,如果不尝试新号码并成功联系到您的朋友,您甚至不知道新号码是否真的可以与您的朋友联系。