如何从JavaScript检测HTTP状态

17

我希望在一个无法控制的脚本中检测页面是否以HTTP状态码200、404或500等状态码交付。

这不可能实现,对吗?


你可以查看页面内容,看看它是否包含“未找到”或“错误”等短语,但这可能是你能做的最好的事情了。 - rjmunro
4个回答

10

让页面使用location.hrefdocument.URL向自身发出XMLHttpRequest,并检查所获得的HTTP状态。对我而言,这似乎是一种相当便携的方式。尽管为什么要这样做超出了我的理解范畴;)


是的,这就是我最终采用的解决方案--此外,我还进行了HTTP HEAD请求,以避免客户端下载整个页面两次。为什么要这样做?想象一下,我正在编写一个供网站管理员在其网站上安装的.js文件。 - EoghanM
这是很危险的,因为第二个请求可能会以意想不到的方式改变服务器(但双重提交页面)等。此外,同一个请求可能会成功一次,但下一次失败。 - WhyNotHugo
1
我有点困惑,@EoghanM和我都没有提到POST。他甚至说他使用了HEAD。使用GET或HEAD应该是安全的,因为它们是幂等方法,不应该引起副作用。 - anddoutoi
“为什么你会做这样的事?”——因为你的404页面与另一个页面相同,你想在客户端处理小差异。;) - Jayen
我想在页面为404时设置<base href>,因此我需要尽早且同步地执行此操作。但如果页面为200,则这可能会变得很烦人并导致速度变慢。 - Jayen

1

页面A可以是一个通过AJAX加载页面B并使用document.write或弹出窗口等方式显示的Javascript。

在这种策略中,您可以在AJAX处理程序中检查成功/失败的返回代码,并根据状态向输出窗口发送不同的内容。

大多数Ajax库都提供了一种检查返回代码的方法...

例如,在Prototype.js中使用Ajax.Request时可以查看"transport.status"。


听起来你在使用 transport.status 上是正确的 - 理想情况下,我想避免另一个 HTTP 请求,但也许这是唯一的方法? - EoghanM
我没有足够的经验来确定这是否是唯一的方法。如果您使用我提供的答案,您还需要遵守Javascript的安全模型,并仅从同一站点获取页面。虽然可以通过巧妙地使用代理来解决这个问题。 - Paul

-2
为什么 JavaScript 需要知道这个?听起来更有意义的是将其嵌入到自定义 404 页面中。没有必要检测父页面的 HTTP 状态(我认为这是不可能的 - 或许可以在每次加载后对自身进行 ajax 调用,但那只是愚蠢的)。如果代码正在执行,则保证是 404。

1
我无法创建自定义404页面,因为脚本“超出了我的控制范围” - 我不制作HTML并且404页面不会在我的站点上 :) - EoghanM
制作浏览器扩展时遇到了同样的问题 - 如果当前URL返回404错误并且是某个网站上常见页面的拼写错误,我正在尝试重定向到该页面。我选择使用AJAX解决方案,因为我不认为在第一次和第二次请求之间的毫秒级时间内,页面的删除状态会经常发生变化。 - Brian Hannay

-3

我最近发现了如何做到这一点(感谢:hunlock

AJAX.getAllResponseHeaders() -- 返回当前使用的所有标头字符串。 AJAX.getResponseHeader("headerLabel") -- 返回请求标头的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接