关于Apache的内容协商(2)
浏览:1751次 出处信息
Apache可以协商的内容基本有四类:
modules/mappers/mod_negotiation.c
对于协商的表达方式都是一样的,如:
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
关于文档类型的协商依赖的是: 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
- 文档类型: content-type, 通过accept来说明
- 语言: language, 通过accept-language来说明
- 字符集: charset, 通过accept-charset来说明
- 编码: encoding, 通过accept-encoding来说明; (注意是传输过程的编码,不是字符的编码)
modules/mappers/mod_negotiation.c
- typedef struct {
- apr_pool_t *pool;
- request_rec *r;
- neg_dir_config *conf;
- char *dir_name;
- int accept_q; /* 1 if an Accept item has a q= param */
- float default_lang_quality; /* fiddle lang q for variants with no lang */
- /* the array pointers below are NULL if the corresponding accept
- * headers are not present
- */
- apr_array_header_t *accepts; /* accept_recs */
- apr_array_header_t *accept_encodings; /* accept_recs */
- apr_array_header_t *accept_charsets; /* accept_recs */
- apr_array_header_t *accept_langs; /* accept_recs */
- apr_array_header_t *avail_vars; /* available variants */
- int count_multiviews_variants; /* number of variants found on disk */
- int is_transparent; /* 1 if this resource is trans. negotiable */
- int dont_fiddle_headers; /* 1 if we may not fiddle with accept hdrs */
- int ua_supports_trans; /* 1 if ua supports trans negotiation */
- int send_alternates; /* 1 if we want to send an Alternates header */
- int may_choose; /* 1 if we may choose a variant for the client */
- int use_rvsa; /* 1 if we must use RVSA/1.0 negotiation algo */
- } negotiation_state;
typedef struct { apr_pool_t *pool; request_rec *r; neg_dir_config *conf; char *dir_name; int accept_q; /* 1 if an Accept item has a q= param */ float default_lang_quality; /* fiddle lang q for variants with no lang */ /* the array pointers below are NULL if the corresponding accept * headers are not present */ apr_array_header_t *accepts; /* accept_recs */ apr_array_header_t *accept_encodings; /* accept_recs */ apr_array_header_t *accept_charsets; /* accept_recs */ apr_array_header_t *accept_langs; /* accept_recs */ apr_array_header_t *avail_vars; /* available variants */ int count_multiviews_variants; /* number of variants found on disk */ int is_transparent; /* 1 if this resource is trans. negotiable */ int dont_fiddle_headers; /* 1 if we may not fiddle with accept hdrs */ int ua_supports_trans; /* 1 if ua supports trans negotiation */ int send_alternates; /* 1 if we want to send an Alternates header */ int may_choose; /* 1 if we may choose a variant for the client */ int use_rvsa; /* 1 if we must use RVSA/1.0 negotiation algo */ } 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
- typedef struct accept_rec {
- char *name; /* MUST be lowercase */
- float quality;
- float level;
- char *charset; /* for content-type only */
- } accept_rec;
typedef struct accept_rec { char *name; /* MUST be lowercase */ float quality; float level; char *charset; /* for content-type only */ } 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
建议继续学习:
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
后一篇:Squid 透明代理优化 >>
文章信息
- 作者:phpor 来源: PHPor 的blog
- 标签: 内容协商
- 发布时间:2011-02-27 22:56:47
建议继续学习
近3天十大热文
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [54] 图书馆的世界纪录
- [54] android 开发入门
- [54] 如何拿下简短的域名
- [52] Oracle MTS模式下 进程地址与会话信
- [52] Go Reflect 性能
- [49] 【社会化设计】自我(self)部分――欢迎区
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [41] 程序员技术练级攻略
- [35] 视觉调整-设计师 vs. 逻辑