我编写了一个 RESTful 网络服务,它只被设备使用,从不被浏览器使用。这些设备通过所有者现有的家用路由器访问互联网,并通过每隔 30 秒通过路由器发送 HTTP 请求来与 Web 服务通信。这些请求大多是“轮询”请求,以查看 Web 服务是否有关于设备的任何新信息。
我想阻止任何 ISP 透明代理拦截请求并返回缓存的响应。我读到过这样做的一种方法是将随机查询字符串附加到请求的 URL 末尾,以欺骗代理认为这是一个独特的请求。例如:
http://webservicedomain.com/poll/?randomNumber=384389
我有能力做到这一点,但这是最好的方法吗?有点像黑客。
最佳答案
你应该使用 HTTP's Cache-Control header实现这一目标。
在您应该发送的回复中:
Cache-Control: private, must-revalidate, max-age=0
- private - 表示全部或部分响应消息供单个用户使用,不得由共享缓存缓存。
- max-age=0 - 表示客户端愿意接受年龄不大于 0 秒的响应。 IE。响应立即过时。
- must-revalidate - 当出现在缓存接收到的响应中时,该缓存在它变得陈旧后不得使用该条目来响应后续请求,而无需首先与源服务器重新验证它。
您还应该发送 Pragma header对于遗留的 HTTP/1.0 中间服务器:
Pragma: no-cache
相关阅读:
关于web-services - 使用我的网络服务的客户如何绕过他们的 ISP 的透明代理缓存以确保他们的请求到达我的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314777/