【问题标题】:Does an <img> tag respond to all Http 4XX errors the same as 404s?<img> 标签对所有 Http 4XX 错误的响应是否与 404 相同?
【发布时间】:2015-02-13 15:07:59
【问题描述】:

编辑:为了澄清我的问题,这就是我想要理解的内容。

如果网页嵌入了这样的图像:

`<img src="...">`

浏览器如何处理从图片 url 接收到不同的 HTTP 错误状态码?它在浏览器中是否非常一致,并且基本上与图像不存在一样(404)?

请注意,我知道我可以“试一试”,但我没有每个浏览器/操作系统/手机都可以试一试,我想了解这实际上是如何合理地工作的现代桌面和移动浏览器(〜IE9和更新的模糊线)。另外,如果其他人都想知道同样的事情,他们也可以来这里看看答案;-)

原始问题:

我正在实现一个 REST 服务,它可以安全地为客户端返回图像和视频。

我想为不同类型的故障发送不同的 HTTP 响应代码会很好:

  • 一般错误为 400(错误请求)
  • 如果用户无权查看图片,则为 401
  • 如果不允许用户查看图像,则为 403(禁止)
  • 如果找不到图片,则为 404

从 HTML 和 Javascript 的角度来看,对于所有相当现代的浏览器,使用这些不同的错误代码进行响应是否与 404 响应完全相同?

我当然知道错误代码会有所不同,但我要确保不会因为使用这些错误代码而弹出奇怪的安全错误不同的 HTTP 响应。

【问题讨论】:

  • 试试?带有正确标头的 401 将显示身份验证弹出窗口,无论资源是如何访问的(直接、img 标记、脚本标记)..
  • 好点!所以我会忽略 401,然后发送 400 或 403.... 其他 Http 代码怎么样...它们还有其他奇怪的问题吗?
  • 我将不得不重复我的“尝试”。 ;-) 您可以阅读 HTTP RFC,但浏览器可能有自己的怪癖。
  • 这就是我在这里问的原因 - RFC 只能让你到目前为止......我在问其他人是否已经走这条路并意识到浏览器 A 在 os X 上运行有怪癖 B ;-)如果他们确实这么说,那么我可以自己检查那个场景,看看它是否真的有问题,并且会在此处记录下来供其他人查找,而不必自己尝试;-)
  • 我不太明白这个问题。 http 协议不知道它在发送/接收什么。错误代码不受随附内容的限制。由浏览器相应地处理这些错误。

标签: image http http-error


【解决方案1】:

许多公共 API 都会给出 403,例如,当一个具有临时访问时间的对象到期时,Amazon 的 S3 服务会以 403 响应。

例如像这样的 url 会生成带有以下响应的 403(注意:以下不是有效的 S3 url...密钥/签名已更改)

https://somebucket.s3.amazonaws.com/test/4a828d8cf5633ab41e2fb8deba599178.jpg?AWSAccessKeyId=ACIAICGLRMBL2PTLALHQ&Expires=1424782953&Signature=sWko4DDDRaBS151iEhEZzfDRbU%3D

<Error>
<script/>
<Code>AccessDenied</Code>
<Message>Request has expired</Message>
<Expires>2015-02-24T13:02:33Z</Expires>
<ServerTime>2015-02-24T13:02:55Z</ServerTime>
<RequestId>F4949A0376EC9DCD</RequestId>
<HostId>
BV8KMzUcmymBUWctoB8mzFAhzcCAMil/F3NXP/KyKxJd/Hun6O2lUh4b0BsVcP9iwjL1sJxreug=
</HostId>
</Error>

【讨论】:

  • 仍然注意到我的问题的答案 - 我想知道浏览器很好地支持哪些不同的状态,但似乎答案可能就是所有这些。至少这证明/显示了一个发送 403 的 api。谢谢!
【解决方案2】:

由于您使用的是 REST,我假设您使用的是 Ajax 或 Angular 来请求您的图像,对吧? 在这种情况下,由 javascript 来捕获错误。因此,当 javascript 正确处理它时,您的浏览器不会显示任何弹出窗口。 你可以从

之类的东西开始
$.ajaxSetup({
    statusCode: {
      401: function(err){
        console.log('Login Failed.', err.responseJSON);
        // or whatever...
      }
    }
  });

注意,401error 可以在响应的标头中找到,并替换了“Content-Type: image/png”标头。因此客户端(浏览器)无法知道是否请求了图像并像处理任何其他页面一样处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多