div.example { background-color: rgba(229, 236, 243, 1); color: rgba(0, 0, 0, 1); padding: 0.5em; margin: 1em 2em 1em 1em }
div.warning { border: 1px solid rgba(255, 0, 0, 1) }

在httpd的反向代理中,ProxyPass 的主要作用就是修改Content-Location和Location的内容。对这两个首部的含义做一些说明。

内容协商(content negotiation)

为了说明Content-Location的含义,必须先明白http的内容协商机制。

考虑支持多语言的服务器端:一个相同的URL可以返回不同语言版本的文档, 其实服务器端就是利用内容协商来识别客户端的,具体可以参见《http权威指南》第17章。  在请求的头信息中,包含有Accept开头的内容协商首部,服务器端可以根据这些内容协商首部来判断出客户端的需求。 除此之外,服务器端还可以根据诸如User-Agent这种首部信息进行推测,例如老版本的浏览器可能不支持JavaScript,如果User-Agent代表老版本的浏览器,那么服务器可以向其响应不包含JavaScript的文档。

在上面的请求头部中,我们看到了多个内容协商首部。 在Accept-Languoge中我们还发现了q值,这叫做质量值。 考虑这种情况,假如服务器端仅仅拥有中文和英文两个版本,并没有日文,但是客户端却最希望能请求到日文内容,这样服务器端就无法提供合适的文档给它了。 而q值的意义就是让客户端可以提供多个候选方案,q值(0.0-1.0)越大表明优先级越高,例如上图中表明:优先选择日文,如果没有日文优先选择en-US,没有en-US,那就选择en。

上面这种内容协商机制叫做服务器端协商。 为了减轻服务器端的压力,我们可以使用中间代理来代替服务器端来与客户端协商,这叫做透明协商。 中间代理如果可以代替服务器,那么代理必须有能力可以完全像服务器那样处理协商逻辑。对于每一种不同的请求服务器端响应的不同版本的文档,我们可以称作是一个 变体。 代理需要有能力根据每一个请求的信息,从缓存的副本中选择 或者 向服务器请求(当副本中没有对应的时候),得到准确的变体。 从上面服务器端协商的讨论中我们知道除了内容协商首部外,服务器能够根据其他首部(例如user-agent)来识别客户端,从而响应不同的变体。 为了让代理具有完全相同的处理协商逻辑的能力,服务器在响应代理的时候,必须告诉代理除了内容协商首部外还根据什么信息处理协商逻辑了,这个首部叫做vary,例如vary:User-Agent。

值得注意的是 协商首部是客户端请求中的头信息,用来向服务器端说明自身的请求特性;而vary是服务器端响应中的头信息,主要作用是用来帮助中间代理处理与客户端的协商逻辑。 

Content-Location和Content

Content-Location首部表明返回数据的另一种位置。主要的使用场景是用来表明作为内容协商结果响应的资源的URL。

Location和Content-Location是不同的:Location表明重定向的目标(302),而Content-Location表明无需进行进一步的内容协商就可以直接访问的资源的URL,例如英文环境客户端发送 url_file_a  可以得到文件fileA,那么假设响应中Content-Location中内容为 url_file_a_en ,则这个url可以直接访问到对应的那个英文文件,此时其实就不存在内容协商了。 Location是一个与响应相关的头信息,而Content-Location是与返回的内容主体相关的头信息。

参考:

《http权威zhinan》 第17章

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Location

Location和Content-Location的更多相关文章

  1. 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  2. window.location.href = window.location.href 跳转无反应 a 超链接 onclick 点击跳转无反应

    错误写法 , 主要是在 href="#"这里 <a href="#" id="send" onclick="return b ...

  3. 关于js中"window.location.href"、"location.href"、"parent.location.href"、"top.location.href"的用法

    location.href 和 window.location.href 区别: 1.location.href 可以直接跳转其他地址(不属于本项目) 也可以跳转本项目中的 2.window.loca ...

  4. JS中 window.location 与window.location.href的区别

    疑惑:window.location='url'  与window.lcoation.href='url'效果一样,都会跳转到新页面,区别在哪?查得的资料如下: 1:window.location是页 ...

  5. js中的 window.location、document.location、document.URL 对像的区别(转载)

    原文:http://www.cr173.com/html/18417_1.html 当我们需要对html网页进行转向的时候或是读取当前网页的时候可以用到下面三个对像: window.location. ...

  6. 关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别(跳出iframe方法)

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  7. 关于js中window.location.href,location.href,parent.location.href,top.location.href的使用方法

    关于js中"window.location.href"."location.href"."parent.location.href".&qu ...

  8. 关于js中window.location.href,location.href,parent.location.href,top.location.href用法

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  9. javascript:location.reload()和location.replace()的区别,及对图片缓存的影响。

    有段时间没有清理IE的临时文件(缓存文件),在我清理的时候,我突然发现一个问题. 我打开的一个网站,图片默认缓存一个月的,但我发现,当我上传图片或删除图片之后,图片重新缓存,也就意味着,在我上传新图片 ...

  10. One difference between AngularJS' $location and window.location

    Recenently, I encountered a problem. Client side code is: $http({ url: "/api/runtimelicense&quo ...

随机推荐

  1. 记 CentOS 服务器上安装 neo4j 图数据库及本地访问

    下载 去官网下载压缩包放到服务器上.地址为neo4j 下载中心,我这里选择的是 Neo4j 3.5.25 (tar).具体如何做呢?我这里使用的是土方法,即先压缩包下载到本地电脑(win 10系统), ...

  2. 所有CSS字体属性

    font(在一个声明中设置所有的字体属性) font-family(指定文本的字体系列) font-size(指定文本的字体大小) font-style(指定文本的字体样式) font-variant ...

  3. JavaDailyReports10_20

    1 package varycode; 2 class Grandparent 3 { 4 public Grandparent() 5 { 6 7 System.out.println(" ...

  4. C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    C++14在标准库里添加了一个很有意思的元函数: std::integer_sequence.并且通过它衍生出了一系列的帮助模板: std::make_integer_sequence, std::m ...

  5. 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...

  6. umi3.2+ targets ie不生效的问题

    直接创建umi项目 config.ts对targets{ie:11}不生效 错误方法1: 在入口页app.tsx新增 import @babel/polyfill 错误方法2: 在入口页app.tsx ...

  7. OpenOCD安装与使用(JTAG调试)

    本文介绍openocd开源软件的安装以及搭配JTAG对Xilinx u500VC707devkit的调试 PC OS: Ubuntu20.04 LTS Target ARCH: riscv64 JTA ...

  8. Rancher首席架构师解读Fleet:它何以管理百万集群?

    作者简介 Darren Shepherd,Rancher Labs联合创始人及首席架构师.在加入Rancher之前,Darren是Citrix的高级首席工程师,他在那里从事CloudStack.Ope ...

  9. git的使用命令总结

    git一般方法git init 本地目录生成仓库git clone +项目url地址 克隆远程仓库git status 查看状态git pull 拉取 拉取的代码在用户家目录下git push 上传g ...

  10. select 里面带的值居然是估算的?

    mysql> set profiling=1;Query OK, 0 rows affected, 1 warning (0.07 sec) mysql> select count(1) ...