又一个菜鸟博客

转载:HTTP协议的基础知识

1. 什么是HTTP协议

我们知道HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它是一种分布式,合作式,多媒体住处系统服务,面向应用层的协议(同时它也是基于网络层tcp协议的)。

2.HTTP协议是怎么工作的

当我们想浏览一个网站的时候,如www.dianyuan.com。建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。然后电源网(www.dianyuan.com)服务器接到请求后,给予相应的响应信息其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。最后 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。这就是完整的HTTP协议的工作过程。

3.HTTP协议的基础。

浏览器和web服务器之间通过http在internet上进行数据的发送和接收,这些数据也被称为http消息(message)。http消息可以是客户端到服务器的请求消息,也可以是服务器到客户端

消息(message)的一般格式:

Message = start-line (Request-line | status-line)

*message-header

CRLF

[message-body]

我们先看请求信息内容

(1). 请求内容的组成:

Message=Request-line

*message-header

CRLF

[message-body]

(2)请求行的结构(Request-line):
Reqest-Method Request-URI HTTP-Version CRLF

*Request-Method: 请求方法:POST,GET,PUT,DELETE(注意要大写)

*HTTP-Version: http协议的版本(1.0/1.1)

*注:CRLF为回车换行;

(3)例子:

Message = POST ./li.php HTTP/1.0\nUser_Agent: XML-RPC Client\nHost: www.dianyua.com\nContent-Type:image/png\nContent-Length: 8\n\n[message-body];

*注:[message-body]自己定义:如username=yaoming&pwd=123

我们再看响应消息内容

(1)响应内容:message=status-line

* message-header

[message-body]

(2)状态行:status-line的结构:

HTTP-Version status-code Reason-Phrase

CRLF

*注:状态码:status-code:

状态码表示响应类型
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误

*注:404—没有找到

*注:401—未授权

*注:403—-禁用

我们再来看看HTTP消息报头内容

1.Message-header分为普通报头(general-header ),请求报头( Request-header ) , 实体报头(entity-header)

2.报头的格式:名字+“:”+空格+值

(1)普通报头:gengerl-header

<1>Cache-Control

Cache-Contrlol 常用头域被用于指定指令,此指令必须被在请求/响应链上的所有缓存机制遵守。注意HTTP/1.0缓存并不能实现Cache-Control,而是只实现Pragma:no-cache..请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、 proxy-revalidate、max-age。

<2>Date

Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

<3> Pragma

Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

(2)请求信息报头(Request-header)

<1>Host

Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

<2>Referer

Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可 用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

<3>Accept

Accept请求头域被用于指定服务器返回客房端可接受的响应媒体类型。如:image/png,text/html等;

<4>Accept-Charset

此头域可以用来指出请求客房端能接受什么样的字符集响应。如: utf8,iso-8859-5;

<5>Accept-Language,Authorization,From,Host,If-Modified-Since,User-Agent等等

(3)响应报头(Response-head);

<1>Expires

它给出了在何日何时之后响应即被视为陈旧的。一个陈旧的缓存项不能被缓存返回级客房端。它的日期格式是绝对日期。由HTTP-date定义的。它必须是RFC1123的格式。例如:Thu,01 Dec 1994 16:00:00 GMT

<2>Content-Encoding

它是对媒体类型的修饰。其值表明对实体以何种方式的内容编码。

<3>Content-Language

它描述了实体面向用户的语言。

<4>Content-Type

指明发给接收者的实体的媒体类型。Content-Type: text/html;charset=ISO-8859-4

当然这里面还有很多关于报头的命令,这里不一一列举。

4.最后我们来看看php与HTTP的结合

Php内建的函数和全局变量都可以获取对HTTP请求中传递的任何消息的内容

(1).getallHeaders() =>返回的是一个数组

(2) 超全局变量$_SERVER, HTTP_HOST,HTTP_PORT,HTTP_ACCEPT,REQUEST_METHOD

Php与响应

Php中使用header()将HTTP响应状态行和报头发送到浏览器

header ( string string [, bool replace [, int http_response_code]] )

(1).返回状态行:

header(“HTTP/1.0 404 NOT FONUD”);

(2).返回响应报头

Header(“WWW-Authenticte:BASIC”);

(3).重定向,设置内容和类型

(4)php禁止客房端缓存:

<?php
header(“Expries: Thu,01 Jun 1970 00:00:00 GMT”);</br>
header(“Last-Modify:”.gmdate(“D,d M Y H:i:s”.”GMT”)); header(“Cache-control: no-store, no-cache,must-revalidate”);
header(“Cache-control: post-check,pre-check=0”,false);header(“prama:no-cache”);
?>

<5>php模拟HTTP请求:

<?php

$host=”localhost”;

$port=80;

$request=”username=yaoming&pwd=123″;

$fp = fsockopen($host, $port);

$query=”POST/zxu.phpHTTP/1.0\r\nUser_Agent:Client\r\nHost:”.$host.”\r\nAccept:*/*\r\nContent-Type:application/x-www-form-urlencoded;charset=UTF-8\r\nContent-Length:”.strlen($request).”\r\n\r\n”.$request.”\n”;

echo $query;

//把构造好的HTTP协议发送给服务器,失败返回false

if (!fputs($fp, $query, strlen($query)))

{

$errstr = “Write error”;

return false;

}

//获取从服务器端返回的所有信息,包括HTTP头和XML信息

$contents = “”;

while (!feof($fp))

{

$contents .= fgets($fp);

}

//关闭连接资源后返回获取的内容

fclose($fp);

echo $contents;

?>

Query Construction 查询构造

Term Query (单词查询)

word1

Multi-Term Query (多词查询)

+word1 author:word2 -word3

Boolean Query (布尔查询)

+(word1 word2 word3) author:(word4 word5) -word6

Wildcard Query (通配符查询)

field1:test*

Fuzzy Query (模糊查询)

field1:test~

Phrase Query (语句查询)

Range Query (随机查询)

mod_date:[20020101 TO 20030101] title:{Aida To Carmen}

yui 3.0.0pr2 base css

此framework在我看来如同对于其他3个css的轻量级渲染,也是yui css比较精华所在,全篇使用em作为单位.

/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 3.0.0pr2
*/

/* base.css, part of YUI's CSS Foundation */
h1 {
	/*18px via YUI Fonts CSS foundation*/
	/*在13px的基础1em之上增大到18px,增律为138.5%*/
	font-size:138.5%;
}
h2 {
	/*16px via YUI Fonts CSS foundation*/
	/*在13px的基础1em之上增大到16px,增律为123.1%*/
	font-size:123.1%;
}
h3 {
	/*14px via YUI Fonts CSS foundation*/
	/*在13px的基础1em之上增大到14px,增律为108%*/
	font-size:108%;
}
h1,h2,h3 {
	/* top &amp; bottom margin based on font size */
	/* 上下留一个字的外补丁 */
	margin:1em 0;
}
h1,h2,h3,h4,h5,h6,strong {
	/*bringing boldness back to headers and the strong element*/
	/*把重点标签表示的明显一些*/
	font-weight:bold;
}
abbr,acronym {
	/*indicating to users that more info is available */
	/*指明有效信息 */
	border-bottom:1px dotted #000;
	cursor:help;
}
em {
	/*bringing italics back to the em element*/
	/*给em斜体*/
	font-style:italic;
}
blockquote,ul,ol,dl {
	/*giving blockquotes and lists room to breath*/
	/*给块和列表呼吸的空间*/
	margin:1em;
}
ol,ul,dl {
	/*bringing lists on to the page with breathing room */
	/*使列表有更加通畅的空间,我认为主要是来纠正bug和留出列表符号位置. */
	margin-left:2em;
}
ol li {
	/*giving OL's LIs generated numbers*/
	/*给数字符号*/
	list-style: decimal outside;
}
ul li {
	/*giving UL's LIs generated disc markers*/
	/*给圆点*/
	list-style: disc outside;
}
dl dd {
	/*giving UL's LIs generated numbers*/
	/*英文注释可能有问题,主要为了使dd与dt错后一个字符.*/
	margin-left:1em;
}
th,td {
	/*borders and padding to make the table readable*/
	/*增加表格的可识别性*/
	border:1px solid #000;
	padding:.5em;
}
th {
	/*distinguishing table headers from data cells*/
	/*强调表头*/
	font-weight:bold;
	text-align:center;
}
caption {
	/*coordinated margin to match cell's padding*/
	/*留出表的空间*/
	margin-bottom:.5em;
	/*centered so it doesn't blend in to other content*/
	/*居中为了与其他内容区分*/
	text-align:center;
}
p,fieldset,table,pre {
	/*so things don't run into each other*/
	/*为了不适彼此融合*/
	margin-bottom:1em;
}
/* setting a consistent width, 160px;
   control of type=file still not possible */
/* 统一宽度为160px,但保留文件域默认,其中使用了css2的选择符,仍然使用的相对宽度,做了ie5的纠正 */
input[type=text],input[type=password],textarea{width:12.25em;*width:11.9em;}

YUI 3.0.0pr2 fonts css

如果想使用其他字号,只需要设定%就可以.但是13px对于中文来说是不可行的,所以想要使用须按照他的模式或继承重新处理.那么同样也增加了contextual版本

/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 3.0.0pr2
*/
/**
 * Percents could work for IE, but for backCompat purposes, we are using keywords.
 * x-small is for IE6/7 quirks mode.
 * 这里我也并没有明白真正意图,从注释分析到为了ie做了处理但考虑兼容使用了关键词并没有使用数值.
 * 分析代码:使用了缩略写法,但是不知道这么处理是否继承问题,因为ie6有这个bug.字体大小依然用了13px但是没有用1em不知何故(难道small等于1em?那么其他浏览器则会自动处理放大和缩小处理),行高用了比例,换算回来是16px,依次使用4种字体供选择.
 */
body {
	font:13px/1.231 arial, helvetica, clean, sans-serif;
	*font-size:small;
	*font:x-small;
}
/**
 * Nudge down to get to 13px equivalent for these form elements
 * 3.0.0pr2 新增内容 微调使之与13px相等
 */
select,
input,
button,
textarea {
	font:99% arial,helvetica,clean,sans-serif;
}

table {
	font-size:inherit;
	font:100%;
}
/**
 * Bump up IE to get to 13px equivalent
 * 提升ie到13px,使用了ie hacker.
 */
pre, code, kbd, samp, tt {
	font-family:monospace;
	*font-size:108%;
	line-height:100%;
}

YUI 3.0.0pr2 reset css

yui3 reset ccs相对于2.5.1并没有什么改动只是增加了几个todo.比较有趣的是增加了context模式,所谓context模式就是可以与其他css framework或已经自定义的css下使用,工作原理也非常简单,只是在所有css定义前面加了.yui-cssreset 的命名空间,那么针对此处理我的建议是自己在基于css framework下写的css要处理好命名空间和尽量少继承其他css定义,这样可以保证耦合度非常低而且高内聚,使之不论替换任何css framework的情况和放到不同页面中的widget都能正常.

/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 3.0.0pr2
*/
/*为背景定义了颜色*/
html {
	color:#000;
	background:#FFF;
}
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
	margin:0;
	padding:0;
}
/*合并边线,边线空间至零.*/
table {
	border-collapse:collapse;
	border-spacing:0;
}
/*清除边线*/
fieldset, img {
	border:0;
}
address, caption, cite, code, dfn, em, strong, th, var {
	font-style:normal;
	font-weight:normal;
}
li {
	list-style:none;
}
caption, th {
	text-align:left;
}
h1, h2, h3, h4, h5, h6 {
	font-size:100%;
	font-weight:normal;
}
/*添加空字符清除融合*/
q:before, q:after {
	content:'';
}
abbr, acronym {
	border:0;
	font-variant:normal;
}
/* to preserve line-height and selector appearance */
sup {
	vertical-align:text-top;
}
sub {
	vertical-align:text-bottom;
}
input, textarea, select {
	font-family:inherit;
	font-size:inherit;
	font-weight:inherit;
}
/*to enable resizing for IE*/
/*在ie下重定义*/
input, textarea, select {
*font-size:100%;
}
/*because legend doesn't inherit in IE */
/*IE下legend不继承 */
legend {
	color:#000;
}

CSS Sprites–深入探讨http协议

这是既前年的一篇日志的更新,在这一年我对http协议有了更进一步的认识,其中非常得益于去年国内sns api的大热,我制作了校内的app我的豆瓣整合了两个sns,从中学习了大量的oauth和rest等知识.更得益于最近手头的两本书.它们是

这两本书实质与http协议并没有关系,但是都和http紧密关联,有趣的是一本偏于后端技术,一本纯前端,说明http协议的知识对于大部分从事web开发的人来说都有很大的意义.最后我要感谢天津观光2路汽车,是你每天带着我让我有时间拜读这两本书.下面我要借与两本书参合我的认识做一个http协议的综述.

简单的http,复杂的web

客户端请求 服务器端响应
GET /hello.txt Hello , World!

简单的http0.9就是这个样子了,但我们从中看到了可循址性和无状态性.

GET /index.php HTTP/1.1
Host : www.myued.com
User-Agent: Mozilla/5.0 (x11; U;)……
Accept : text/xml,application/xml,application/xhtml+xml,text/html;q=0.9…
Accept-Language: us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Keep-Alive:300
Connection:keep-alive

 

因为客户端(主要指浏览器)请求资源的时候,对于同一个域只能同时请求两个资源(这个东西是人为规定的,一开始我还以为规定在服务器端,所以产生很多疑问,毕竟http是无面向连接,后来才知道是规定在客户端的),而每一个http请求平均往返延迟0.2秒,如果网站装载20项,造成2潜伏期第二单,不论他们是样式表,图象或文字。 (平均宽带连接与浏览器能够下载两个组件的时候)。
因为浏览器花费大约80 %的时间获取外部元件,例如脚本,样式表和图像。所以减少http请求具有最大影响提高网站的性能。此外,它是最容易的方法,使绩效改进。

css sprites 允许你创建一个包含所有的网页画面的图片,即只有一个单一的图片和只有单一服务器请求,所得图片与原图片大小差不多,因为空是被压缩的。在该文件中,你将放置所有的独立图片 ,而且你的界面要有足够的分离空间,他们不能运行超过对方。然后设定背景位置(使用负值提高背景)和包含足够的空间,只出现在背景元素。

就是说把一个网页的所有图片放到一个图片里,然后调动不同的位置显示,好处就是减少服务器进程,因为按照yahoo的高性能网站规则中说服务器进程比起带宽更重要。

校内网应用开发php会话问题

什么是session?

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

好的,我们知道了session_id是客户端和服务器端共识的标识符了,常规我们可以利用cookie保存这个标识,但是对于校内网的所有请求由校内服务器统一发出http请求,那么原始的办法肯定会行不通的.这样我们需要找到特异而且共识的标志,我们可以在校内服务器发出的post中找到若干个这样的标识,但是xn_sig_session_key是一个现成的混合好的参数集合用它再合适不过了,但是不知出于那个特殊的符号违反了session_id的命名规则,只要再做一个md5()就可以解决了.

session_id(md5 ( $_POST ['xn_sig_session_key'] )); session_start();

zend framework in web services

Web services

  1. 我们对网络提供的服务有了什么样的需求变化?

    回到几年前,我们上网最不喜欢的就是让别人知道自己的存在,总是想尽各种办法来隐藏自己的身份.那么今天,我们则更喜欢秀出自己真实的色彩,把自己的日记发布出来,发布自己的照片和视频,最近社区也逐渐走入实名化.那么为什么发生了这种变化呢,我想应该是人们的show本性和对于互联网的可靠和信任提升.

  2. 对于网站架构发生了怎样的改变?

    我听说在互联网刚刚开始的时候发送邮件是收费的,yahoo第一个开始支持免费邮箱直到今天连邮箱的空间都无限了,但是它提供的服务都是基于yahoo自身,后来有了google,它告诉我们他来帮我们找到资源,今天facebook又告诉我们,你们可以来到我这里提供服务.从中我们看到,互联网也在走向更加的开放更加的"廉价".

    那么,基于原来的形式,客户端发出指令,服务层把指令翻译成资源的操作再返回客户端.这个资源往往是数据库.今天,我们进入一个mashup时代,我们往往需要同时请求不同来源的资源.那么肯定的是这些服务的提供者不会直接让我们来操作他们的数据库,这时就需要一组api来映射资源操作.

  3. SOAP or REST?

    首先不管SOAP还是REST,他们只是规范,对于选择并没有绝对的道理.SOAP是一种面向服务的规范,他并不强调我们对于什么资源,只是强调事情的结果.而REST是一种面向资源的规范,与SOAP相反.那么REST为什么相对来说比较吃香呢?上一话题我已经谈到,这些api在后台对应了某一资源,而资源在后台往往对应的数据库.

yui charts 关于flash遮挡图层的解决方法

我们知道<param value="transparent" name="wmode">可以解决其他浮动层被flash遮挡.对于yui charts是一个js调动的flash统计库,因为flash标签是由js生成的,所以使用起来很爽,完全考虑js既可,但是依然有被遮挡这个问题,所以找到源代码看看就能找到生成flash的字符串拼接,加上哪句就可以了.

此解决方法并不是最好的方法因为改动了原库,不知道还有什么其他方法,另外charts的生成flash标签很好用会针对不同浏览器使用不同的标签,不知道能不能把这部分提取出来用到其他flash上,因为flash标签在很多时候会导致页面不符合w3c标准.

YUI-Mainstream Theme by Buzzdroid.com

 Premium Wordrpess Theme