0

我有一个 nodejs 应用程序,用户可以在其中提供一个外部 url,如 www.google.com,或指向 webapp 页面之一的 url,如 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 会通过。我发现这是因为无效的 url 被重定向到有效的 url,并response.statusCode设置为 200。

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

我不仅希望它不重定向,而且希望它验证提供的 url,以便将statusCode设置为404if the page is not found 而不是302.

这可以做到吗?

4

1 回答 1

1

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

当您请求页面并且服务器以 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 提供内容。

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

于 2017-07-19T22:39:05.573 回答