305 HTTP状态码是什么?如何正确使用它?

4

我所发现的是: "请求资源必须通过Location字段提供的代理访问。Location字段给出了代理的URI。接收方应该通过代理重复此单个请求。305响应只能由原始服务器生成。"

如何正确使用它?如果给定的URL下没有代理怎么办?


你是在什么情境下得到这个信息的? - Pekka
2个回答

8

这是一个重定向,当你想让客户端从其他地方获取内容时使用它。给出的URI不必是俚语中“代理”的意思。它只是最初请求的内容存在的另一个位置。

人们用它来进行负载均衡。我不确定哪些客户端可以正确实现它,所以如果你只想重定向,选择302会更安全。

编辑

HTTP RFC中描述了预期的使用示例:假设你有一个缓存代理,其内容来自真正的服务器(源服务器)。如果有人以某种方式直接访问真实服务器,并且你希望他们从代理处获取内容,则应发送305。


那么305和302有什么区别呢?“预期收件人通过代理重复此单个请求。” - Sarah
其实没什么区别,只是语义不同。当浏览器看到这两种代码时,基本上会执行相同的操作。虽然302更可能被广泛应用于各种浏览器中。302有点被劫持了,因此添加了更多的3xx代码,请查看RFC文档获取更多信息。 - profitphp
收件人应该通过代理再次重复这个单一请求。你可能会卡在“代理”上,它不是类似Squid之类的代理,只是另一个内容存在的地方。和302一样,客户端应该根据头部中位置字段给出的URI而不是刚刚访问并得到302/305响应的URI来请求它想要的内容。 - profitphp
我刚试图实现305响应。我将状态码设置为HTTP/1.1 305 Use Proxy,并设置了Location: http://proxy_ip:port/,但浏览器和wget都没有重定向到它。我甚至使用了Set-proxy指令,但也没有帮助。你们有什么想法吗? - madz

3
很少使用的代码,如果客户端作为通信链中的代理,则服务器是否允许发送它?也许不允许,但是检测代理很难。如果服务器后面紧跟反向代理,那么这个代理会接受305错误并将其转发给HTTP客户端吗?
通常,这是为了重定向“直接访问”,该访问应使用安全代理访问,并且问题是为什么可以进行直接访问?肯定是安全链中出现了问题。
那么谁在乎服务器端使用305呢?我希望您不要尝试生成305响应。
如果您是HTTP客户端,它只是一个重定向,就像302一样,您无需知道自己是否正在与代理交互(有时很难知道)。

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