使用请求模块捕获无效的URL预重定向
我有一个nodejs应用程序,用户可以在其中提供一个外部URL(如www.google.com)或指向其中一个Web应用程序页面的URL 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
}
});
不过,我碰到了一个问题,即指出了不存在会通过web应用程序页面的URL。这一点,我发现,是因为无效的网址被重定向到一个有效的URL,并response.statusCode
被设置为200。
为了解决这个问题,我关掉重定向通过与对象{url: url, followRedirect: false}
更换url
参数,但是这只是导致response.statusCode
设置为302
我不仅希望它不是重定向,但我想它来验证所提供的URL,从而使statusCode
设置为404
如果页面没有找到,而比302
。
可以这样做吗?
我会尝试将我所有的意见转换为答案,以试图解决这个问题。
当你请求一个页面,服务器以302点的状态和重定向URL响应,这可能意味着这类事情的人:
而不是显示你所请求的URL的网页内容,服务器希望您首先转到其他URL(例如,当您尚未登录时)。登录后,对该URL的请求很好,可能会显示常规内容。
该网址的内容可能已暂时移至其他网址,因此服务器希望浏览器转至其他网址并在该网址获取相关内容。
服务器可能曾经支持了URL,但现在不再做,并希望将浏览器来描述该问题的一般性页面(技术上服务器也许应该使用404本,但不是所有的意志。
有可能实际上有一个包罗万象的处理程序不支持的URL和而不是给你一个通用的404页,他们正在将您重定向到其他地方的网站上。
当你得到一个302状态回来了,你无法知道它是哪一个,完全取决于他们如何编码它们发生这些或所有这些可能是。
所以,当你测试一个URL并获得一个302的时候,你只需要做出你自己的策略决定就是如何表征这个特定的URL。在那个时候,该URL没有特定的页面内容。相反,它由推荐到另一个URL组成。它是一个有效的服务器和请求URL,并且您从服务器获得有效的响应,但它只是对另一个URL的引用,而不是页面内容本身。
我觉得你有四种一般情况处理:
你得到的页面内容2xx应答状态。我假设你想将其描述为一个有效的URL。
您会得到400或更高的响应状态。我假设你想将其描述为不是有效的URL。
您得到的响应状态为3xx(如302)及其重定向到的URL为您提供2xx响应状态和页面内容。这是您自己的应用程序的政策决定,你想如何描述它。如果不了解您的应用正在尝试执行的所有操作都与表征网址有关,那么我们无法帮助您。决定什么是您的应用程序的最佳利益。
您得到的响应状态为3xx(如302),并且它重定向到的URL不会为您提供页面内容的2xx响应状态。我假设你想将这个分类为不是有效的URL。它生成了对不良页面的推荐。
因此,在我看来,似乎情况1,2和4都很清楚您将如何处理它们。这只会让案例#3为您决定什么是最适合您的应用的。
看来,你开始了与概念,有一个302页具有内容和302不具有页面内容和你莫名其妙地想知道这两个之间的区别。情况根本不是这样。 302表示现在,该服务器不会为您提供该网址的任何网页内容,而是希望您转到其他网址。你不知道为什么。你不知道这只是一个暂时的情况。所有你知道的是,服务器正在响应该URL,但是正在给客户一个推荐去其他地方,而不是直接从该URL提供内容。
这就像你打电话给你的朋友,你会得到一个录音信息,你的朋友现在可以在一个新的不同的号码(这就像302)达到。没有一些外部环境,你无法知道这只是一种暂时的情况,或者这是一种永久性的情况。而且,如果没有尝试新号码并成功联系到您的朋友,您甚至不知道新号码是否真的可以联系到您的朋友。
你最后一句话是什么意思?您不控制返回的状态码。如果目标服务器想要返回一个302,那就是它要做的事情。你只需要决定当你得到一个302时该怎么做。你可以决定你不喜欢这是一个有效的回应,你可以看看它被重定向到什么,并根据它决定(如重定向到同一个域,只是一个不同的路径),或者你可以去验证它被重定向到的URL。这完全取决于你。 – jfriend00
@ jfriend00你说得对,我不能告诉它返回什么,但我想知道'request'模块是否有假装没有请求重定向的方式,所以不是返回302,而是返回一个404或200.在我的情况下,重定向应该是有效的,但我也想确保提供的url指向有效的页面。 – pushkin
不,我不认为请求模块有这个选项。你自己在响应处理程序中编写它。如果你想允许重定向,但要确保重定向页面是有效的,你不能让它跟着重定向,然后得到一个200页或一些错误状态? – jfriend00