`

[转]关于Apache的内容协商

阅读更多

该功能使得服务器可以根据agent指定的http头来选择合适的资源。
涉及的http头包括: Accept-*
涉及的Apache中的知识: 类型表

1。 需要模块 : modules/mod_negotiation.so
2。 需要在目录的Options中添加: MultiViews;  如: Options FollowSymLinks MultiViews Indexes
3。 参考文档: http://apache.jz123.cn/content-negotiation.html
4。 该功能可能会影响到rewrite,参考: http://www.linuxpk.com/4941.html

apache根据你给的资源名称a,查找所有的a.*资源,加入有两种资源: a.txt 和a.php, 在类型表中查出:
.txt 对应文档类型为: text/plain 
.php 对应文档类型为: application/x-httpd-php

如果请求时使用的 accept为:
text/plain ,则返回a.txt
如果请求时使用的 accept为: application/x-httpd-php ,则返回a.php
如果请求时使用的accept为: text/none ,找不到这种类型,则协商失败,apache返回406,并返回所有可用的类型列表,如:

Not Acceptable

An appropriate representation of the requested resource /a could not be found  on this server.

Available variants:

        
  • a.php , type application/x-httpd-php
  •     
  • a.txt , type text/plain

Apache可以协商的内容基本有四类:

  1. 文档类型: content-type, 通过accept来说明
  2. 语言: language, 通过accept-language来说明
  3. 字符集: charset, 通过accept-charset来说明
  4. 编码: encoding, 通过accept-encoding来说明; (注意是传输过程的编码,不是字符的编码)

相关源码参考:
modules/mappers/mod_negotiation.c

  1. typedef struct {
  2.     apr_pool_t *pool;
  3.     request_rec *r;
  4.     neg_dir_config *conf;
  5.     char *dir_name;
  6.     int accept_q;               /* 1 if an Accept item has a q= param */
  7.     float default_lang_quality; /* fiddle lang q for variants with no lang */
  8.     /* the array pointers below are NULL if the corresponding accept
  9.      * headers are not present
  10.      */
  11.     apr_array_header_t *accepts;            /* accept_recs */
  12.     apr_array_header_t *accept_encodings;   /* accept_recs */
  13.     apr_array_header_t *accept_charsets;    /* accept_recs */
  14.     apr_array_header_t *accept_langs;       /* accept_recs */
  15.     apr_array_header_t *avail_vars;         /* available variants */
  16.     int count_multiviews_variants;     /* number of variants found on disk */
  17.     int is_transparent;       /* 1 if this resource is trans. negotiable */
  18.     int dont_fiddle_headers;   /* 1 if we may not fiddle with accept hdrs */
  19.     int ua_supports_trans;     /* 1 if ua supports trans negotiation */
  20.     int send_alternates;       /* 1 if we want to send an Alternates header */
  21.     int may_choose;           /* 1 if we may choose a variant for the client */
  22.     int use_rvsa;             /* 1 if we must use RVSA/1.0 negotiation algo */
  23. } negotiation_state;

对于协商的表达方式都是一样的,如:

Accept: */*
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

其中“,”和“;”的分隔或许不太好明白其含义,其实,其格式是这样的:
name;q=N;charset=TEXT
如果要表达多组,则用“,”分隔;如:
name;q=N;charset=TEXT,name;q=N;charset=TEXT

其中,q、charset都是可以省略的,如:
Accept: */*
只有一组说明,而且是省略了q和charset


相关源码参考:
modules/mappers/mod_negotiation.c

  1. typedef struct accept_rec {
  2.     char *name;                 /* MUST be lowercase */
  3.     float quality;
  4.     float level;
  5.     char *charset;               /* for content-type only */
  6. } accept_rec;


关于文档类型的协商依赖的是: docs/conf/mime.types
如:
文档类型                     资源扩展名
text/html                   html htm
text/css                    css
text/plain                  txt text conf def list log in  

关于语言和字符集的协商依赖的是: docs/conf/charset.conv
如:
# Lang-abbv Charset     Language
#---------------------------------
en          ISO-8859-1  English
UTF-8       utf8        UTF-8  
Unicode     ucs         Unicode
th          Cp874       Thai    
ja          SJIS        Japanese
ko          Cp949       Korean  
zh          Cp950       Chinese-Traditional
zh-cn       GB2312      Chinese-Simplified
zh-tw       Cp950       Chinese
。。。

其中,第一列是语言的缩写,协商时一般用缩写; 第二列是字符集


---------------------------
内容可能是根据多个条件来协商的,那么对于一个协商的资源可能涉及到多个扩展名的,如:
content.en.html.gz
该资源如果写成了:
content.html.en.gz
也是可以找到的,只是在做超链接的时候,如果写成了: content.gz.html.en 就找不到了
参考: http://httpd.apache.org/docs/2.2/content-negotiation.html#naming

关于内容协商与cache
对于http1.0来讲,经过协商的内容是不建议cache的;在http1.1中添加了vary的http头,用来告知客户端内容是根据哪些条件来协商的,这样客户端可以尽可能的利用cache,如果协商条件不变的话就可以使用cache的。

====================
参考资料:

http://httpd.apache.org/docs/2.2/content-negotiation.html
http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html

 

原文地址:http://phpor.net/blog/post/786/

分享到:
评论

相关推荐

    apache中文手册(html)

    内容协商 动态共享对象(DSO) 环境变量 日志文件 从URL到文件系统的映射 性能调整 安全方面的提示 服务器全局配置 SSL/TLS 加密 CGI脚本的Suexec执行 URL重写指南 虚拟主机 如何.../指南 认证、授权、...

    ApacheV2.0中文手册

    内容协商 动态共享对象(DSO) 环境变量 日志文件 从URL到文件系统的映射 性能调整 安全方面的提示 服务器全局配置 SSL/TLS 加密 CGI脚本的Suexec执行 URL重写指南 虚拟主机 如何.../指南 认证、授权、...

    Apache2.2中文版参考手册

    内容协商 动态共享对象(DSO) 环境变量 日志文件 从URL到文件系统的映射 性能调整 安全方面的提示 服务器全局配置 SSL/TLS 加密 CGI脚本的Suexec执行 URL重写指南 虚拟主机 如何.../指南 认证、授权、...

    Apache HTTP Server Version 2.2 文档(2013.4.10最新)

    内容协商 自定义错误响应 动态共享对象(DSO)支持 Apache的环境变量 过滤器(Filter) 词汇表 Apache处理器的使用 Apache HTTP Server Version 2.2 文档 编译与安装 启动Apache Apache许可证 2.0 版 日志文件 多路处理...

    Apache2.2中文手册

    内容协商 动态共享对象(DSO) 环境变量 日志文件 从URL到文件系统的映射 性能调整 安全方面的提示 服务器全局配置 SSL/TLS 加密 CGI脚本的Suexec执行 URL重写指南 虚拟主机 如何.../指南 认证、授权、...

    Apache主配置文件

    Apache为网络管理员提供了丰富多彩的功能,包括目录索引、目录别名、内容协商、可配置的HTTP错误报告、CGI程序的SetUID执行、子进程资源管理、服务器端图象映射、重写URL、URL拼写检查以及联机手册man等。...

    Apache2.2中文参考.chm

    内容协商 动态共享对象(DSO) 环境变量 日志文件 从URL到文件系统的映射 性能调整 安全方面的提示 服务器全局配置 SSL/TLS 加密 CGI脚本的Suexec执行 URL重写指南 虚拟主机 如何.../指南 认证、授权、...

    Apache 2.2 中文手册

    * 内容协商 * 动态共享对象(DSO) * 环境变量 * 日志文件 * 从URL到文件系统的映射 * 性能调整 * 安全方面的提示 * 服务器全局配置 * SSL/TLS 加密 * CGI脚本的Suexec执行 * URL重写指南 * 虚拟主机 ...

    apache 配置文件解说

    Apache为网络管理员提供了丰富多彩的功能,包括目录索引、目录别名、内容协商、可配置的HTTP错误报告、CGI程序的SetUID执行、子进程资源管理、服务器端图象映射、重写URL、URL拼写检查以及联机手册man等。...

    HCS Debian Linux - Apache Error Pages SL:Apache 错误页面斯洛文尼亚语翻译-开源

    本地化错误页面 apache 模块协商 斯洛文尼亚语翻译

    LinkedDataContentNegotation:链接数据内容协商的代理设置

    LinkedDataContentNegotation 链接数据内容协商的代理设置该Apache 2.4代理设置使用303基于id / doc实现了佛兰芒政府URI策略。此实现将是该策略的参考实施,以便佛兰芒政府内部的其他人员可以快速利用此策略。 此外...

    中小企业服务器配置-Web服务器.docx

    纵观Apache,它为我们的网络管理员提供了丰富多彩的功能,包括目录索引、目录别名、内容协商、可配置的HTTP错误报告、CGI程序的SetUID执行、子进程资源管理、服务器端图象映射、重写URL、URL拼写检查以及联机手册man...

    Apache1.3.22主要改进及修正

    Apache 1.3.20 – 1.3.22主要改进:  安全弱点:  1。在Apache1.3.20的win32平台上发现了一个...发现一个在Multiviews用于目录索引协商时的漏洞。在一些配置中,如果一个URI请求带着M=D的QUERY_STRING,那么可能返

    Apache多路复用模块(MPMs)介绍

    你也许会调整要加载的模块,使用Keepalive、摆弄内容协商模块(mod_negotiation,译注:从几个文档中选择一个最匹配客户端要求的文档)、FollowSymLinks指令(译注:允许在此目录中使用软链接)以及重写功能;...

    Kerberos Module For Apache-开源

    Mod_auth_kerb是向Apache Web服务器提供Kerberos用户身份验证的模块。 它允许检索用户名/密码对,并且还支持完整的Kerberos身份验证(也称为基于协商或SPNEGO的身份验证)。

    csharp-driver:适用于Apache Cassandra的DataStax C#驱动程序

    在服务器端DseAuthenticator中使用身份验证方案协商的IAuthenticator实现。 集成。 与驱动程序无缝集成的地理空间类型的序列化器。 该驱动程序支持.NET Framework 4.5.2+和.NET Core 2.1+( )。 安装 PM > ...

    处理器:本体驱动的链接数据处理器和SPARQL后端服务器。 Apache许可证

    AtomGraph Processor是声明性,可读写链接数据...HTTP内容协商和缓存支持 遵循原则,为每个应用程序状态提供单独的RDF资源 AtomGraph对语义技术的直接使用导致了极端可扩展和灵活的设计,并引领了声明式Web开发的道路。

    restlet-jee-2.1.1.zip

    你甚至可以像普通Web服务器那样,用一个支持内容协商(content negotiation)的Directory类来返回静态文件与目录。 简单性(simplicity)和灵活性(flexibility)是贯穿整个框架的设计原则。Restlet API旨在把HTTP、...

    restlet-jse-2.1.1.zip

    你甚至可以像普通Web服务器那样,用一个支持内容协商(content negotiation)的Directory类来返回静态文件与目录。 简单性(simplicity)和灵活性(flexibility)是贯穿整个框架的设计原则。Restlet API旨在把HTTP、...

    rni:Java中的RPC协商接口

    注意:该库旨在在早期开发周期中使用,然后替换为Apache Thrift或其他版本中更好的库。 可用的其他一些相似之处包括: Apache Thrift(使用Facebook swift库) 莫坦-https: 用法 假设您有一个PersonInterface....

Global site tag (gtag.js) - Google Analytics