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. linux yum install

    作为一名新手,学习Linux已经一个月了,其间遇到了不少问题,而今天笔者遇到的问题是 #yum install pam-devel #This system is not registered to ...

  2. Android驱动学习-灯光系统总体框架

    Android的app访问硬件的大致流程可以分为一下几个步骤: 我们之前说过Android系统在添加新的硬件的时候需要添加一个接口java文件,通过jni来访问硬件. 这个java是我们自己实现的,我 ...

  3. Java JVM——8.堆

    堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域. J ...

  4. TurtleBot3使用课程-第一节a(北京智能佳)

    目录 1.ROS设置(远程PC) 2 1.1 ROS安装和设置 2 1.1.1 设置source.list 2 1.1.2 键设置 2 1.1.3 ROS安装 2 1.1.4安装包构建的依赖关系 2 ...

  5. linux security module机制

    linux security module机制 概要 Hook机制,linux MAC的通用框架,可以使用SElinux, AppArmor,等作为不同安全框架的实现

  6. flume集成hdfs(hdfs开启kerberos认证)

    )当 sink 到 hdfs 时: ) 需修改 flume-env.sh 配置,增添 hdfs 依赖库: FLUME_CLASSPATH="/root/TDH-Client/hadoop/h ...

  7. scala模式匹配 case a @ b语法

    class caseTest { def main(args: Array[String]): Unit = { val c = Person(Student(1),"a") c ...

  8. 4.5万字手把手教你实现MySQL TB级数据存储!!

    写在前面 业界对系统的高可用有着基本的要求,简单的说,这些要求可以总结为如下所示. 系统架构中不存在单点问题. 可以最大限度的保障服务的可用性. 一般情况下系统的高可用可以用几个9来评估.所谓的几个9 ...

  9. Netty学习之IO模型

    目录 1.1 同步.异步.阻塞.非阻塞     同步 VS 异步         同步         异步     阻塞 VS 非阻塞         阻塞         非阻塞     举例   ...

  10. ThreadX移植——STM32H7+MDK-AC6平台

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 在uCOS全家桶宣布开源之后被微软收购的ThreadX也开源了,真是喜大普奔,对于我们这些嵌入式行业从业者来说,能 ...