<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Billy 的博客</title>
	<atom:link href="http://www.billy.net.cn/index.php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.billy.net.cn</link>
	<description>我喜欢喝着咖啡上网，所以只有咖啡和电脑的内容</description>
	<lastBuildDate>Sun, 16 Oct 2011 12:49:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Nginx Rewrite伪静态语法教程[转]</title>
		<link>http://www.billy.net.cn/index.php/archives/329</link>
		<comments>http://www.billy.net.cn/index.php/archives/329#comments</comments>
		<pubDate>Sun, 16 Oct 2011 12:49:01 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[nginx 相关]]></category>
		<category><![CDATA[VPS 服务器]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[rewrite]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=329</guid>
		<description><![CDATA[一、Nginx rewrite基本语法 Nginx的rewrite语法其实很简单.用到的指令无非是这几个 set if return break rewrite 麻雀虽小,可御可萝五脏俱全.只是简单的几个指令却可以做出绝对不输apache的简单灵活的配置. 1.set set主要是用来设置变量用的,没什么特别的 2.if if主要用来判断一些在rewrite语句中无法直接匹配的条件,比如检测文件存在与否,http header,cookie等, 用法: if(条件) {…} - 当if表达式中的条件为true,则执行if块中的语句 -<a href="http://www.billy.net.cn/index.php/archives/329" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>一、Nginx rewrite基本语法</p>
<p>Nginx的rewrite语法其实很简单.用到的指令无非是这几个</p>
<p>set<br />
if<br />
return<br />
break<br />
rewrite</p>
<p>麻雀虽小,可御可萝五脏俱全.只是简单的几个指令却可以做出绝对不输apache的简单灵活的配置.<span id="more-329"></span><br />
1.set</p>
<p>set主要是用来设置变量用的,没什么特别的</p>
<p>2.if</p>
<p>if主要用来判断一些在rewrite语句中无法直接匹配的条件,比如检测文件存在与否,http header,cookie等,</p>
<p>用法: if(条件) {…}</p>
<p>- 当if表达式中的条件为true,则执行if块中的语句</p>
<p>- 当表达式只是一个变量时,如果值为空或者任何以0开头的字符串都会当作false</p>
<p>- 直接比较内容时,使用 = 和 !=</p>
<p>- 使用正则表达式匹配时,使用</p>
<p>~ 大小写敏感匹配<br />
~* 大小写不敏感匹配<br />
!~ 大小写敏感不匹配<br />
!~* 大小写不敏感不匹配</p>
<p>这几句话看起来有点绕,总之记住: ~为正则匹配, 后置*为大小写不敏感, 前置!为”非”操作</p>
<p>随便一提,因为nginx使用花括号{}判断区块,所以当正则中包含花括号时,则必须用双引号将正则包起来.对下面讲到的rewrite语句中的正则亦是如此.<br />
比如 “\d{4}\d{2}\.+”</p>
<p>- 使用-f,-d,-e,-x检测文件和目录</p>
<p>-f 检测文件存在<br />
-d 检测目录存在<br />
-e 检测文件,目录或者符号链接存在<br />
-x 检测文件可执行</p>
<p>跟~类似,前置!则为”非”操作</p>
<p>举例</p>
<p>if ($http_user_agent ~ MSIE) {<br />
rewrite  ^(.*)$  /msie/$1  break;<br />
}</p>
<p>//如果UA包含”MSIE”,rewrite 请求到/msie目录下</p>
<p>if ($http_cookie ~* “id=([^;] +)(?:;|$)” ) {<br />
set  $id  $1;<br />
}</p>
<p>//如果cookie匹配正则,设置变量$id等于正则引用部分</p>
<p>if ($request_method = POST ) {<br />
return 405;<br />
}</p>
<p>//如果提交方法为POST,则返回状态405 (Method not allowed)</p>
<p>if (!-f $request_filename) {<br />
break;<br />
proxy_pass  <a href="http://127.0.0.1/" target="_blank">http://127.0.0.1</a>;<br />
}</p>
<p>//如果请求文件名不存在,则反向代理localhost</p>
<p>if ($args ~ post=140){<br />
rewrite ^ <a href="http://example.com/" target="_blank">http://example.com/</a> permanent;<br />
}</p>
<p>//如果query string中包含”post=140″,永久重定向到example.com</p>
<p>3.return</p>
<p>return可用来直接设置HTTP返回状态,比如403,404等(301,302不可用return返回,这个下面会在rewrite提到)</p>
<p>4.break</p>
<p>立即停止rewrite检测,跟下面讲到的rewrite的break flag功能是一样的,区别在于前者是一个语句,后者是rewrite语句的flag</p>
<p>5.rewrite</p>
<p>最核心的功能(废话)</p>
<p>用法: rewrite 正则 替换 标志位</p>
<p>其中标志位有四种</p>
<p>break – 停止rewrite检测,也就是说当含有break flag的rewrite语句被执行时,该语句就是rewrite的最终结果<br />
last – 停止rewrite检测,但是跟break有本质的不同,last的语句不一定是最终结果,这点后面会跟nginx的location匹配一起提到<br />
redirect – 返回302临时重定向,一般用于重定向到完整的URL(包含http:部分)<br />
permanent – 返回301永久重定向,一般用于重定向到完整的URL(包含http:部分)</p>
<p>因为301和302不能简单的只单纯返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了. 作为替换,rewrite可以更灵活的使用redirect和permanent标志实现301和302. 比如上一篇日志中提到的Blog搬家要做的域名重定向,在nginx中就会这么写</p>
<p>rewrite ^(.*)$ <a href="http://newdomain.com/" target="_blank">http://newdomain.com/</a> permanent;</p>
<p>举例来说一下rewrite的实际应用</p>
<p>rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last;</p>
<p>如果请求为 /download/eva/media/op1.mp3 则请求被rewrite到 /download/eva/mp3/op1.mp3</p>
<p>使用起来就是这样,很简单不是么? 不过要注意的是rewrite有很多潜规则需要注意</p>
<p>- rewrite的生效区块为sever, location, if</p>
<p>- rewrite只对相对路径进行匹配,不包含hostname 比如说以上面301重定向的例子说明</p>
<p>rewrite ~* cafeneko\.info <a href="http://newdomain.com/" target="_blank">http://newdomain.com/</a> permanent;</p>
<p>这句是永远无法执行的,以这个URL为例</p>
<p><a href="http://blog.cafeneko.info/2010/10/neokoseseiki_in_new_home/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=neokoseseiki_in_new_home" target="_blank">http://blog.cafeneko.info/2010/10/neokoseseiki_in_new_home/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=neokoseseiki_in_new_home</a></p>
<p>其中cafeneko.info叫做hostname,再往后到?为止叫做相对路径,?后面的一串叫做query string</p>
<p>对于rewrite来说,其正则表达式仅对”/2010/10/neokoseseiki_in_new_home”这一部分进行匹配,即不包含hostname,也不包含query string .所以除非相对路径中包含跟域名一样的string,否则是不会匹配的. 如果非要做域名匹配的话就要使用if语句了,比如进行去www跳转</p>
<p>if ($host ~* ^www\.(cafeneko\.info)) {<br />
set $host_without_www $1;<br />
rewrite ^(.*)$ http://$host_without_www$1 permanent;<br />
}</p>
<p>- 使用相对路径rewrite时,会根据HTTP header中的HOST跟nginx的server_name匹配后进行rewrite,如果HOST不匹配或者没有HOST信息的话则rewrite到server_name设置的第一个域名,如果没有设置server_name的话,会使用本机的localhost进行rewrite</p>
<p>- 前面提到过,rewrite的正则是不匹配query string的,所以默认情况下,query string是自动追加到rewrite后的地址上的,如果不想自动追加query string,则在rewrite地址的末尾添加?</p>
<p>rewrite  ^/users/(.*)$  /show?user=$1?  last;</p>
<p>rewrite的基本知识就是这么多..但还没有完..还有最头疼的部分没有说…</p>
<p>二、Nginx location 和 rewrite retry</p>
<p>nginx的rewrite有个很奇特的特性 — rewrite后的url会再次进行rewrite检查,最多重试10次,10次后还没有终止的话就会返回HTTP 500</p>
<p>用过nginx的朋友都知道location区块,location区块有点像Apache中的RewriteBase,但对于nginx来说location是控制的级别而已,里面的内容不仅仅是rewrite.</p>
<p>这里必须稍微先讲一点location的知识.location是nginx用来处理对同一个server不同的请求地址使用独立的配置的方式</p>
<p>举例:</p>
<p>location  = / {<br />
&#8230;.配置A<br />
}</p>
<p>location  / {<br />
&#8230;.配置B<br />
}</p>
<p>location ^~ /images/ {<br />
&#8230;.配置C<br />
}</p>
<p>location ~* \.(gif|jpg|jpeg)$ {<br />
&#8230;.配置D<br />
}</p>
<p>访问 / 会使用配置A<br />
访问 /documents/document.html 会使用配置B<br />
访问 /images/1.gif 会使用配置C<br />
访问 /documents/1.jpg 会使用配置D</p>
<p>如何判断命中哪个location暂且按下不婊, 我们在实战篇再回头来看这个问题.</p>
<p>现在我们只需要明白一个情况: nginx可以有多个location并使用不同的配.</p>
<p>sever区块中如果有包含rewrite规则,则会最先执行,而且只会执行一次, 然后再判断命中哪个location的配置,再去执行该location中的rewrite, 当该location中的rewrite执行完毕时,rewrite并不会停止,而是根据rewrite过的URL再次判断location并执行其中的配置. 那么,这里就存在一个问题,如果rewrite写的不正确的话,是会在location区块间造成无限循环的.所以nginx才会加一个最多重试10次的上限. 比如这个例子</p>
<p>location /download/ {<br />
rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  last;<br />
}</p>
<p>如果请求为 /download/eva/media/op1.mp3 则请求被rewrite到 /download/eva/mp3/op1.mp3</p>
<p>结果rewrite的结果重新命中了location /download/ 虽然这次并没有命中rewrite规则的正则表达式,但因为缺少终止rewrite的标志,其仍会不停重试download中rewrite规则直到达到10次上限返回HTTP 500</p>
<p>认真的朋友这时就会问了,上面的rewrite规则不是有标志位last么? last不是终止rewrite的意思么?</p>
<p>说到这里我就要抱怨下了,网上能找到关于nginx rewrite的文章中80%对last标志的解释都是</p>
<p>last – 基本上都用这个Flag</p>
<p>……这他妈坑爹呢!!! 什么叫基本上都用? 什么是不基本的情况?  =皿=</p>
<p>有兴趣的可以放狗”基本上都用这个Flag”…</p>
<p>我最终还是在stack overflow找到了答案:</p>
<p>last和break最大的不同在于</p>
<p>- break是终止当前location的rewrite检测,而且不再进行location匹配<br />
– last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则</p>
<p>还是这个该死的例子</p>
<p>location /download/ {<br />
rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  ;<br />
rewrite  ^(/download/.*)/movie/(.*)\..*$  $1/avi/$2.mp3  ;<br />
rewrite  ^(/download/.*)/avvvv/(.*)\..*$  $1/rmvb/$2.mp3 ;<br />
}</p>
<p>上面没有写标志位,请各位自行脑补…</p>
<p>如果请求为 /download/acg/moive/UBW.avi</p>
<p>last的情况是: 在第2行rewrite处终止,并重试location /download..死循环<br />
break的情况是: 在第2行rewrite处终止,其结果为最终的rewrite地址.</p>
<p>也就是说,上面的某位试图下载eva op不但没下到反而被HTTP 500射了一脸的例子正是因为用了last标志所以才会造成死循环,如果用break就没事了.</p>
<p>location /download/ {<br />
rewrite  ^(/download/.*)/media/(.*)\..*$  $1/mp3/$2.mp3  break;<br />
}</p>
<p>对于这个问题,我个人的建议是,如果是全局性质的rewrite,最好放在server区块中并减少不必要的location区块.location区块中的rewrite要想清楚是用last还是break.</p>
<p>有人可能会问,用break不就万无一失了么?</p>
<p>不对.有些情况是要用last的. 典型的例子就是wordpress的permalink rewrite</p>
<p>常见的情况下, wordpress的rewrite是放在location /下面,并将请求rewrite到/index.php</p>
<p>这时如果这里使用break乃就挂了,不信试试. ｂ（￣▽￣）ｄ…因为nginx返回的是没有解释的index.php的源码…</p>
<p>这里一定要使用last才可以在结束location / 的rewrite, 并再次命中location ~ \.php$,将其交给fastcgi进行解释.其后返回给浏览器的才是解释过的html代码.</p>
<p>关于nginx rewrite的简介到这里就全部讲完了,水平及其有限,请大家指出错漏…</p>
<p>三、实战! WordPress的Permalink+Supercache rewrite实现</p>
<p>这个rewrite写法其实是来自supercache作者本家的某个评论中,网上很容易查到,做了一些修改. 先给出该配置文件的全部内容..部分内容码掉了..绝对路径什么的你知道也没啥用对吧?</p>
<p>server {<br />
listen   80;<br />
server_name  cafeneko.info <a href="http://www.cafeneko.info/" target="_blank">www.cafeneko.info</a>;</p>
<p>access_log  ***;<br />
error_log   *** ;</p>
<p>root   ***;<br />
index  index.php;</p>
<p>gzip_static on;</p>
<p>if (-f $request_filename) {<br />
break;<br />
}</p>
<p>set $supercache_file ”;<br />
set $supercache_uri $request_uri;</p>
<p>if ($request_method = POST) {<br />
set $supercache_uri ”;<br />
}</p>
<p>if ($query_string) {<br />
set $supercache_uri ”;<br />
}</p>
<p>if ($http_cookie ~* “comment_author_|wordpress_logged_|wp-postpass_” ) {<br />
set $supercache_uri ”;<br />
}</p>
<p>if ($supercache_uri ~ ^(.+)$) {<br />
set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;<br />
}</p>
<p>if (-f $document_root$supercache_file) {<br />
rewrite ^(.*)$ $supercache_file break;<br />
}</p>
<p>if (!-e $request_filename) {<br />
rewrite . /index.php last;<br />
}</p>
<p>location ~ \.php$ {</p>
<p>fastcgi_pass   127.0.0.1:9000;<br />
fastcgi_index  index.php;<br />
fastcgi_param  SCRIPT_FILENAME  ***$fastcgi_script_name;<br />
include        fastcgi_params;<br />
}</p>
<p>location ~ /\.ht {<br />
deny  all;<br />
}<br />
}</p>
<p>下面是解释:</p>
<p>gzip_static on;</p>
<p>如果浏览器支持gzip,则在压缩前先寻找是否存在压缩好的同名gz文件避免再次压缩浪费资源,配合supercache的压缩功能一起使用效果最好,相比supercache原生的Apache mod_rewrite实现,nginx的实现简单的多. Apache mod_rewrite足足用了两套看起来一模一样的条件判断来分别rewrite支持gzip压缩和不支持的情况.</p>
<p>if (-f $request_filename) {<br />
break;<br />
}</p>
<p>//如果是直接请求某个真实存在的文件,则用break语句停止rewrite检查</p>
<p>set $supercache_file ”;<br />
set $supercache_uri $request_uri;</p>
<p>//用$request_uri初始化变量 $supercache_uri.</p>
<p>if ($request_method = POST) {<br />
set $supercache_uri ”;<br />
}</p>
<p>//如果请求方式为POST,则不使用supercache.这里用清空$supercache_uri的方法来跳过检测,下面会看到</p>
<p>if ($query_string) {<br />
set $supercache_uri ”;<br />
}</p>
<p>//因为使用了rewrite的原因,正常情况下不应该有query_string(一般只有后台才会出现query string),有的话则不使用supercache</p>
<p>if ($http_cookie ~* “comment_author_|wordpress_logged_|wp-postpass_” ) {<br />
set $supercache_uri ”;<br />
}</p>
<p>//默认情况下,supercache是仅对unknown user使用的.其他诸如登录用户或者评论过的用户则不使用.</p>
<p>comment_author是测试评论用户的cookie, wordpress_logged是测试登录用户的cookie. wp-postpass不大清楚,字面上来看可能是曾经发表过文章的?只要cookie中含有这些字符串则条件成立.</p>
<p>原来的写法中检测登录用户cookie用的是wordpress_,但是我在测试中发现登入/登出以后还会有一个叫wordpress_test_cookie存在,不知道是什么作用,我也不清楚一般用户是否会产生这个cookie.由于考虑到登出以后这个cookie依然存在可能会影响到cache的判断,于是把这里改成了匹配wordpress_logged_</p>
<p>if ($supercache_uri ~ ^(.+)$) {<br />
set $supercache_file /wp-content/cache/supercache/$http_host$1index.html;<br />
}</p>
<p>//如果变量$supercache_uri不为空,则设置cache file的路径</p>
<p>这里稍微留意下$http_host$1index.html这串东西,其实写成 $http_host/$1/index.html 就好懂很多</p>
<p>以这个rewrite形式的url为例</p>
<p>cafeneko.info/2010/09/tsukihime-doujin_part01/</p>
<p>其中<br />
$http_host = ‘cafeneko.info’ , $1 = $request_uri = ‘/2010/09/tsukihime-doujin_part01/’</p>
<p>则 $http_host$1index.html = ‘cafeneko.info/2010/09/tsukihime-doujin_part01/index.html’</p>
<p>而 $http_host/$1/index.html = ‘cafeneko.info//2010/09/tsukihime-doujin_part01//index.html’</p>
<p>虽然在调试过程中两者并没有不同,不过为了保持正确的路径,还是省略了中间的/符号.</p>
<p>最后上例rewrite后的url = ‘cafeneko.info/wp-content/cache/supercache/cafeneko.info/2010/09/tsukihime-doujin_part01/index.html’</p>
<p>if (-f $document_root$supercache_file) {<br />
rewrite ^(.*)$ $supercache_file break;<br />
}</p>
<p>//检查cache文件是否存在,存在的话则执行rewrite,留意这里因为是rewrite到html静态文件,所以可以直接用break终止掉.</p>
<p>if (!-e $request_filename) {<br />
rewrite . /index.php last;<br />
}</p>
<p>//执行到此则说明不使用suercache,进行wordpress的permalink rewrite</p>
<p>检查请求的文件/目录是否存在,如果不存在则条件成立, rewrite到index.php</p>
<p>顺便说一句,当时这里这句rewrite看的我百思不得其解. .</p>
<p>只能匹配一个字符啊?这是什么意思?</p>
<p>一般情况下,想调试nginx rewrite最简单的方法就是把flag写成redirect,这样就能在浏览器地址栏里看到真实的rewrite地址.</p>
<p>然而对于permalink rewrite却不能用这种方法,因为一旦写成redirect以后,不管点什么链接,只要没有supercache,都是跳转回首页了.</p>
<p>后来看了一些文章才明白了rewrite的本质,其实是在保持请求地址不变的情况下,在服务器端将请求转到特定的页面.</p>
<p>乍一看supercache的性质有点像302到静态文件,所以可以用redirect调试.</p>
<p>但是permalink却是性质完全不同的rewrite,这跟wordpress的处理方式有关. 我研究不深就不多说了,简单说就是保持URL不变将请求rewrite到index.php,WP将分析其URL结构再对其并进行匹配(文章,页面,tag等),然后再构建页面. 所以其实这条rewrite</p>
<p>rewrite . /index.php last;</p>
<p>说的是,任何请求都会被rewrite到index.php.因为”.”匹配任意字符,所以这条rewrite其实可以写成任何形式的能任意命中的正则.比如说</p>
<p>rewrite . /index.php last;<br />
rewrite ^ /index.php last;<br />
rewrite .* /index.php last;</p>
<p>效果都是一样的,都能做到permalink rewrite.</p>
<p>最后要提的就是有人可能注意到我的rewrite规则是放在server块中的.网上能找到的大多数关于wordpress的nginx rewrite规则都是放在location /下面的,但是上面我却放在了server块中,为何?</p>
<p>原因是WP或某个插件会在当前页面做一个POST的XHR请求,本来没什么特别,但问题就出在其XHR请求的URL结构上.</p>
<p>正常的permalink一般为: domain.com/year/month/postname/ 或者 domain.com/tags/tagname/ 之类.</p>
<p>但这个XHR请求的URL却是 domain.com/year/month/postname/index.php 或者 domain.com/tags/tagname/index.php</p>
<p>这样一来就命中了location ~ \.php$而交给fastcgi,但因为根本没有做过rewrite其页面不可能存在,结果就是这个XHR返回一个404</p>
<p>鉴于location之间匹配优先级的原因,我将主要的rewrite功能全部放进了server区块中,这样就得以保证在进行location匹配之前是一定做过rewrite的.</p>
<p>这时有朋友又要问了,为什么命中的是location ~ \.php$而不是location / ?</p>
<p>…望天…长叹…这就要扯到天杀的location匹配问题了….</p>
<p>locatoin并非像rewrite那样逐条执行,而是有着匹配优先级的,当一条请求同时满足几个location的匹配时,其只会选择其一的配置执行.</p>
<p>其寻找的方法为:</p>
<p>1. 首先寻找所有的常量匹配,如location /, location /av/, 以相对路径自左向右匹配,匹配长度最高的会被使用,<br />
2. 然后按照配置文件中出现的顺序依次测试正则表达式,如 location ~ download\/$, location ~* \.wtf, 第一个匹配会被使用<br />
3. 如果没有匹配的正则,则使用之前的常量匹配</p>
<p>而下面几种方法当匹配时会立即终止其他location的尝试</p>
<p>1. = 完全匹配,location = /download/<br />
2. ^~ 终止正则测试,如location ^~ /download/ 如果这条是最长匹配,则终止正则测试,这个符号只能匹配常量<br />
3. 在没有=或者^~的情况下,如果常量完全匹配,也会立即终止测试,比如请求为 /download/ 会完全命中location /download/而不继续其他的正则测试</p>
<p>总结:</p>
<p>1. 如果完全匹配(不管有没有=),尝试会立即终止<br />
2. 以最长匹配测试各个常量,如果常量匹配并有 ^~, 尝试会终止<br />
3. 按在配置文件中出现的顺序测试各个正则表达式<br />
4. 如果第3步有命中,则使用其匹配location,否则使用第2步的location</p>
<p>另外还可以定义一种特殊的named location,以@开头,如location @thisissparta 不过这种location定义不用于一般的处理,而是专门用于try_file, error_page的处理,这里不再深入.</p>
<p>晕了没? 用前文的例子来看看</p>
<p>location  = / {<br />
&#8230;.配置A<br />
}</p>
<p>location  / {<br />
&#8230;.配置B<br />
}</p>
<p>location ^~ /images/ {<br />
&#8230;.配置C<br />
}</p>
<p>location ~* \.(gif|jpg|jpeg)$ {<br />
&#8230;.配置D<br />
}</p>
<p>访问 / 会使用配置A -&gt; 完全命中<br />
访问 /documents/document.html 会使用配置B -&gt; 匹配常量B,不匹配正则C和D,所以用B<br />
访问 /images/1.gif 会使用配置C -&gt; 匹配常量B,匹配正则C,使用首个命中的正则,所以用C<br />
访问 /documents/1.jpg 会使用配置D -&gt; 匹配常量B,不匹配正则C,匹配正则D,使用首个命中的正则,所以用D</p>
<p>那么再回头看我们刚才说的问题.为什么那个URL结果奇怪的XHR请求会命中location ~ \.php$而不是location / ? 我相信你应该已经知道答案了.</p>
<p>所以要解决这个问题最简单的方法就是把rewrite规则放在比location先执行的server块里面就可以了哟.</p>
<p>这次的研究笔记就到此为止了.</p>
<p>最后留一个思考题,如果不将rewrite规则放入server块,还有什么方法可以解决这个XHR 404的问题?</p>
<p>原来的location /块包含从location ~ \.php$到root为止的部分.</p>
<p>答案是存在的.在用使用目前的方法前我死脑筋的在保留location /的前提下尝试了很多种方法…请不要尝试为各种permalink构建独立的location.因为wp的permalink种类很多,包括单篇文章,页面,分类,tag,作者,存档等等..欢迎在回复中讨论 /</p>
<p>参考: Nginx wiki</p>
<p>更新  @2010.10.23</p>
<p>之前的supercache rewrite规则适用于大部分的WP.但是并不适用于mobile press插件的移动设备支持.</p>
<p>因为其中并没有检测移动设备的user agent,从而导致移动设备也会被rewrite到cache上.这样的结果是在移动设备上也是看到的跟PC一样的完全版blog. 对于性能比较好的手机比如iphone安卓什么的大概没什么问题,但比较一般的比如nokia上用opera mini等看就会比较辛苦了,这次把supercache原本在htaccess中的移动设备检测的代码块也移植了过来.</p>
<p>在前文的配置文件中cookie检测后面加入以下代码段</p>
<p># Bypass special user agent<br />
if ($http_user_agent ~* “2.0 MMP|240&#215;320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo Wii|Nitro|Nokia|Opera Mini|Palm|PlayStation Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915 Obigo|LGE VX|webOS|Nokia5800&#8243;) {<br />
set $supercache_uri ”;<br />
}</p>
<p>if ($http_user_agent ~* “w3c |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-”) {<br />
set $supercache_uri ”;<br />
}</p>
<p>这样就可以对移动设备绕开cache规则,而直接使用mobile press产生的移动版的效果了.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/329/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress开启gzip压缩方法</title>
		<link>http://www.billy.net.cn/index.php/archives/325</link>
		<comments>http://www.billy.net.cn/index.php/archives/325#comments</comments>
		<pubDate>Wed, 06 Jul 2011 20:41:30 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=325</guid>
		<description><![CDATA[前阵子换了服务器后发现流量飞增，自己当时也没想到是没有开启gzip的原因，因为上个服务器默认开启了，当自己想到的时候从后台登录cpanel 一看，晕，竟然没有那个优化网站的选项，google之，发现网上介绍的方法也很多，有改php.ini的，有改.htaccess的，呃，方法很多，奶 牛也测试了一些，最后，种种原因，木有成功，不是主页不正常显示就是内部错误，这个方法毕竟都是有适应环境的，所以嘛，嘻嘻，不解释。 今天放一个奶牛测试成功了的方法，这个方法针对wordpress博客哦，操作很简单，只要在博客根目录下的index.php文件中加入一行代码就可以了。 找到根目录下的index.php文件中的 define('WP_USE_THEMES', true); 注意，这里的index.php文件是根目录下的，不是主题目录下的哦~ 将上面代码的后面添加一行 ob_start('ob_gzhandler'); 就可以了，保存退出，上传文件。然后从http://tool.chinaz.com/Gzips/等类似网站就可以查询自己的网站是否开启了gzip，嘻嘻，去试试吧~~~开启gzip可以压缩网页传输的文件，加快网站的载入速度，挺不错滴~]]></description>
			<content:encoded><![CDATA[<blockquote><p><span style="font-size: small;">前阵子换了服务器后发现流量飞增，自己当时也没想到是没有开启gzip的原因，因为上个服务器默认开启了，当自己想到的时候从后台登录cpanel 一看，晕，竟然没有那个优化网站的选项，google之，发现网上介绍的方法也很多，有改php.ini的，有改.htaccess的，呃，方法很多，奶 牛也测试了一些，最后，种种原因，木有成功，不是主页不正常显示就是内部错误，这个方法毕竟都是有适应环境的，所以嘛，嘻嘻，不解释。</span></p>
<p><span style="font-size: small;">今天放一个奶牛测试成功了的方法，这个方法针对wordpress博客哦，操作很简单，只要在博客根目录下的index.php文件中加入一行代码就可以了。</span></p>
<p><span style="font-size: small;">找到根目录下的index.php文件中的</span></p>
<pre><span style="font-size: small;">define('WP_USE_THEMES', true);</span></pre>
<p><span style="font-size: small;"><span id="more-325"></span></span></p>
<pre></pre>
<p><span style="font-size: small;">注意，这里的index.php文件是根目录下的，不是主题目录下的哦~</span></p>
<p><span style="font-size: small;">将上面代码的后面添加一行</span></p>
<pre><span style="font-size: small;">ob_start('ob_gzhandler');</span></pre>
<p><span style="font-size: small;">就可以了，保存退出，上传文件。然后从http://tool.chinaz.com/Gzips/等类似网站就可以查询自己的网站是否开启了gzip，嘻嘻，去试试吧~~~开启gzip可以压缩网页传输的文件，加快网站的载入速度，挺不错滴~</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/325/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>startssl免费申请SSL证书教程</title>
		<link>http://www.billy.net.cn/index.php/archives/314</link>
		<comments>http://www.billy.net.cn/index.php/archives/314#comments</comments>
		<pubDate>Tue, 28 Jun 2011 05:48:56 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[nginx 相关]]></category>
		<category><![CDATA[VPS 服务器]]></category>
		<category><![CDATA[Web 服务器]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[startssl]]></category>
		<category><![CDATA[免费]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[申请]]></category>
		<category><![CDATA[证书]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=314</guid>
		<description><![CDATA[1、首先进入startssl证书申请网址进入后，第一个介绍就是StartSSL™ Free，我们点击NO kidding 100% FREE进入申请网址！敬告：最好使用IE申请！但IE6下可能页面显示有问题！ Just Shot Store 2、进入后为自动登陆，申请账户，快速获取证书！我们点击Express Lane，进入快速申请！ 3、进入新注册页面，注意：所有信息都必须填写，而且地址要写详细，您可以提供真实的信息，或者编写的，但必须按照他的要求填写，以英文地址填写方法填写（示例只是为了演示）！注册后需要等待审核通过。 4、如果审核通过，你会在你注册的时候的邮箱内收到一封内容类似于下面的邮件，你按链接点过去，照提示一步一步就可以在你浏览器上安装一个证书了，这个证 书用于登录startssl网站，Startssl官网不是通过邮箱和密码登陆的， 只提供证书登陆，所以如果你丢了证书，那只能重新注册用户了。 5、当认证通过后，就可以看到下面的界面了，我们先做验证向导，点击Validations Wizard 选择Domain name validation 然后继续，选择您的域名，注意：不要输入WWW，后缀需要选择！<a href="http://www.billy.net.cn/index.php/archives/314" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p><span><span style="font-family: Simsun;"><span style="font-size: small;">1、首先进入<span style="color: #284c6f;"><a href="http://wgphb.com/php/r.php?url=http%3A%2F%2Fwww.startssl.com%2F%3Fapp%3D39" target="_blank">startssl证书申请网址</a></span>进入后，第一个介绍就是StartSSL™ Free，我们点击NO kidding 100% FREE进入申请网址！敬告：最好使用IE申请！但IE6下可能页面显示有问题！<span id="more-314"></span></span></span></span></p>
<p><span><span style="font-family: Simsun;"><span style="font-size: small;"><a href="http://www.jssharp.com" target="_blank">Just Shot Store</a><br />
</span></span></span></p>
<p><img src="http://chlefa.blu.livefilestore.com/y1pArD914SjcOd62Da8b9ozT_n8NJeeJ5t2uL4-mcaFqUTPQPtCJpvh1YSQxJOjbi6Xd0dgIndcWnPujgT3oMr_2hrQMkIz7UEE/startsslfree.JPG?psid=1" border="0" alt="" width="546" height="350" /><br />
2、进入后为自动登陆，申请账户，快速获取证书！我们点击<strong>Express Lane</strong>，进入快速申请！<br />
<img src="http://chlefa.blu.livefilestore.com/y1pDWqIcfdbWJHizPQz0sRDfgkFDJFEilFQTmJAIgAim8cMsfI9FF-_li8lSObVOj5ZvE1zobciUOTGBzoMbxzYcpJxrQNSV2L0/startauth.JPG?psid=1" border="0" alt="" width="534" height="450" /><br />
3、进入新注册页面，注意：所有信息都必须填写，而且地址要写详细，您可以提供真实的信息，或者编写的，但必须按照他的要求填写，以英文地址填写方法填写（示例只是为了演示）！注册后需要等待审核通过。<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021590.jpg" alt="" width="600" height="374" /><br />
4、如果审核通过，你会在你注册的时候的邮箱内收到一封内容类似于下面的邮件，你按链接点过去，照提示一步一步就可以在你浏览器上安装一个证书了，这个证 书用于登录startssl网站，Startssl官网不是通过邮箱和密码登陆的， 只提供证书登陆，所以如果你丢了证书，那只能重新注册用户了。<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021591.jpg" alt="" width="600" height="336" /><br />
5、当认证通过后，就可以看到下面的界面了，我们先做验证向导，点击Validations Wizard 选择Domain name validation 然后继续，选择您的域名，注意：不要输入WWW，后缀需要选择！<img src="http://www.chinaz.com/upimg/allimg/101111/1021592.jpg" alt="" width="600" height="234" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021593.jpg" alt="" width="600" height="224" /><br />
6、输入完网址后，需要验证网站所有者，主要向邮箱发送验证信息，验证邮箱前缀为postmaster@您的域名，hostmaster@您的域名，webmaster@您的域名，以及您注册域名时填写的邮箱<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021594.jpg" alt="" width="600" height="287" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021595.jpg" alt="" width="600" height="204" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021596.jpg" alt="" width="600" height="225" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021597.jpg" alt="" width="600" height="217" /><br />
7、验证添加完域名后，开始申请SSL证书！点击左上角的CertificatesWizard选择WEB Server SSL/TSL Certifites！<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021598.jpg" alt="" width="600" height="246" /><br />
8、接着您需要输入个人密钥，最少需要10位数，最大为32位数，必须为数字以及字母，不允许有符号，最好数字和字母混合！keysize最好为 2048，因为一般Cpanel控制面板支持2048，不支持4096大小！点击Continue后系统开始生成密钥，这个过程可能有点长，生成完毕后， 记得一定要按提示保存好那个私钥文件，否则到后面证书文件得到了，私钥文件丢了，就没法在做认证了。<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/1021599.jpg" alt="" width="600" height="266" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/10215910.jpg" alt="" width="600" height="340" /><br />
9、生成完个人密钥后，您需要选择域名以及子域名，我们在里面填写WWW即可，您也可以选择其他子域名！然后开始生成公钥，这个过程也有点长，生成后的公钥您需要将其保存！</p>
<p><img src="http://www.chinaz.com/upimg/allimg/101111/10215911.jpg" alt="" width="600" height="220" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/10215912.jpg" alt="" width="600" height="251" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/10215913.jpg" alt="" width="600" height="179" /><br />
<img src="http://www.chinaz.com/upimg/allimg/101111/10215914.jpg" alt="" width="600" height="193" /></p>
<p><img src="http://www.chinaz.com/upimg/allimg/101111/10215916.jpg" alt="" width="600" height="308" /></p>
<p>10、下面就等待几个小时，去邮箱看看刚申请的域名https证书是否成功得到了，如果得到了，就去下载证书文件就是了，相应步骤如下。<br />
<img src="http://www.chinaz.com/upimg/allimg/101111/10215915.jpg" alt="" width="600" height="322" /></p>
<p>11、Startssl SSL证书就算申请好了</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/314/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vps lnmp 环境下 wordpress 多站功能启用</title>
		<link>http://www.billy.net.cn/index.php/archives/311</link>
		<comments>http://www.billy.net.cn/index.php/archives/311#comments</comments>
		<pubDate>Tue, 28 Jun 2011 01:26:57 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[lnmp]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[功能]]></category>
		<category><![CDATA[启用]]></category>
		<category><![CDATA[多站]]></category>
		<category><![CDATA[环境]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=311</guid>
		<description><![CDATA[首先从官网 wordpress.org 下载最新安装包解压缩： 1、推荐先备份一下数据库，以防万一； 2、从后台停用一切插件； 3、将wp-admin和wp-includes上传至 wordpress 安装目录，可以完全覆盖，也可以删除这两个文件夹再上传； 4、将解压包根目录下除wp-config.php外的所有文件覆盖到服务器上wordpress根目录。切记别覆盖wp-config.php，这个里边是你的数据库等信息。否则会没有办法升级。 完成后直接在浏览器输入http://你的域名/wp-admin/upgrade.php进行升级吧，如果没有意外会很顺利的完成。 其实wordpress3.0最引人注目的是多站点功能，这样可以解决爱好者无需在服务器上安装多个wp以实现多博客的问题。 第一步：编辑配置文件 编辑根目录的 wp-config.php 文件，找到以下代码： define ('WPLANG', 'zh_CN'); 在其之后添加以下代码： define('WP_ALLOW_MULTISITE',<a href="http://www.billy.net.cn/index.php/archives/311" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>首先从官网 wordpress.org 下载最新安装包解压缩：</p>
<p>1、推荐先备份一下数据库，以防万一；</p>
<p>2、从后台停用一切插件；</p>
<p>3、将wp-admin和wp-includes上传至 wordpress 安装目录，可以完全覆盖，也可以删除这两个文件夹再上传；</p>
<p>4、将解压包根目录下除wp-config.php外的所有文件覆盖到服务器上wordpress根目录。切记别覆盖wp-config.php，这个里边是你的数据库等信息。否则会没有办法升级。<span id="more-311"></span></p>
<p>完成后直接在浏览器输入http://你的域名/wp-admin/upgrade.php进行升级吧，如果没有意外会很顺利的完成。</p>
<p>其实wordpress3.0最引人注目的是多站点功能，这样可以解决爱好者无需在服务器上安装多个wp以实现多博客的问题。</p>
<p>第一步：编辑配置文件</p>
<p>编辑根目录的 wp-config.php 文件，找到以下代码：</p>
<pre>define ('WPLANG', 'zh_CN');</pre>
<p>在其之后添加以下代码：</p>
<pre>define('WP_ALLOW_MULTISITE', true);</pre>
<p>这个时候刷新后台页面，工具菜单中已经有网络 (Network) 选项。</p>
<p>第二步：停用插件</p>
<p>为了顺利设置多站点功能，需要暂停所有已安装旧插件，可以在操作完成后重新开启。</p>
<p>第三步：创建文件夹</p>
<p>通过 FTP 或者其他方式在 wp-content 目录下创建 blogs.dir 目录，属性为 777 模式。这个目录用于存储子站点上传的媒体文件。</p>
<p>第四步：追加配置代码</p>
<p>刷新管理页面，点击工具菜单中的网络 (Network) 选项卡，系统会自动生成需要追加的代码片段。其中和 wp-config.php 相关的有两段代码。首先在后添加以下代码：</p>
<pre>define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false );
$base = '/'; //基准 URL
define( 'DOMAIN_CURRENT_SITE', 'www.yourname.com' ); //请将 www.yourname.com 替换为主站域名
define( 'PATH_CURRENT_SITE', '/' ); //当前博客路径
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );</pre>
<p>为了保证站点安全，需要接着添加以下代码尾随其后：</p>
<pre>define( 'AUTH_SALT', '...' );
define( 'SECURE_AUTH_SALT', '...' );
define( 'LOGGED_IN_SALT', '...' );
define( 'NONCE_SALT', '...' );</pre>
<p>这两段代码每个博客都不一样，请直接从后台提示页面拷贝。</p>
<p>第五步：修改Rewrite 规则，加入以下代码：</p>
<p>server_name_in_redirect off;</p>
<p>port_in_redirect off;</p>
<p>rewrite ^.*/files/(.*) /wp-content/blogs.php?file=$1;</p>
<p>if (!-e $request_filename) {</p>
<p>rewrite ^.+?(/wp-.*) $1 last;</p>
<p>rewrite ^.+?(/.*\.php)$ $1 last;</p>
<p>rewrite ^ /index.php last;</p>
<p>}</p>
<p>OK,完工。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/311/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VPS主机LNMP环境下解决wordpress自动更新提示FTP</title>
		<link>http://www.billy.net.cn/index.php/archives/302</link>
		<comments>http://www.billy.net.cn/index.php/archives/302#comments</comments>
		<pubDate>Tue, 28 Jun 2011 01:00:07 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[lnmp]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[主机]]></category>
		<category><![CDATA[提示]]></category>
		<category><![CDATA[更新]]></category>
		<category><![CDATA[自动]]></category>
		<category><![CDATA[解决]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=302</guid>
		<description><![CDATA[本博客用的是美国VPS，自己装的LNMP环境，但是在wordpress后台自动更新的时候，一直提示要填FTP信息。但是自己没有装SFTP。感觉没必要用 Winscp就挺好的。 其实这是因为安装LNMP时，不是用的WWW用户安装的原因。用chown修改下文件权限就可以了 chown -R www /home/wwwroot 把目录下wwwroot所有文件和文件夹的所有者改成叫做www的用户。经测试，wordpress可以顺利的自动升级了。]]></description>
			<content:encoded><![CDATA[<p>本博客用的是美国VPS，自己装的LNMP环境，但是在wordpress后台自动更新的时候，一直提示要填FTP信息。但是自己没有装SFTP。感觉没必要用 Winscp就挺好的。<br />
其实这是因为安装LNMP时，不是用的WWW用户安装的原因。用chown修改下文件权限就可以了</p>
<p>chown -R www /home/wwwroot</p>
<p>把目录下wwwroot所有文件和文件夹的所有者改成叫做www的用户。经测试，wordpress可以顺利的自动升级了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/302/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox 5 已经在用了，Firefox 6新特性预览</title>
		<link>http://www.billy.net.cn/index.php/archives/300</link>
		<comments>http://www.billy.net.cn/index.php/archives/300#comments</comments>
		<pubDate>Mon, 27 Jun 2011 15:12:15 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[电脑资讯]]></category>
		<category><![CDATA[5]]></category>
		<category><![CDATA[6]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[新]]></category>
		<category><![CDATA[特性]]></category>
		<category><![CDATA[预览]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=300</guid>
		<description><![CDATA[Firefox 5这次终于没有跳票，如期发布了，这个版本新增了一些特性，值得前端开发人员关注。同时，Mozilla之前放出了Firefox6会支持的一些特性，我们在此一起了解下。 Firefox 6 新特性： 支持progress元素； 增加window.machMedia()方法以匹配CSS3的媒体查询； 二进制数据API增强，包括XHR2和FileReader等； WebSockets回归； CSS text-decoration支持 -moz-text-decoration-color,-moz-text-decoration-line和-moz-text-decoration-style子属性； 在交互的tab中，setTimeout和setInterval会延迟更多； onhashchange时间新增newURL和oldURL属性； 实现了beforeprint和afterprint事件； 事件新增defaultPrevented属性，以判断event.preventDefault()方法是否被调用； element.dataset属性可以用来获取或者修改HTML元素的”data-”前缀属性； DOM3 CustomEvent规范实现； 清除浏览器cookie的时候也会清掉Flash的cookie。<a href="http://www.billy.net.cn/index.php/archives/300" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Firefox 5这次终于没有跳票，如期发布了，这个版本新增了一些特性，值得前端开发人员关注。同时，Mozilla之前放出了Firefox6会支持的一些特性，我们在此一起了解下。<span id="more-300"></span></p>
<h2>Firefox 6 新特性：</h2>
<ol>
<li>支持progress元素；</li>
<li>增加window.machMedia()方法以匹配CSS3的媒体查询；</li>
<li>二进制数据API增强，包括XHR2和FileReader等；</li>
<li>WebSockets回归；</li>
<li>CSS text-decoration支持 -moz-text-decoration-color,-moz-text-decoration-line和-moz-text-decoration-style子属性；</li>
<li>在交互的tab中，setTimeout和setInterval会延迟更多；</li>
<li>onhashchange时间新增newURL和oldURL属性；</li>
<li>实现了beforeprint和afterprint事件；</li>
<li>事件新增defaultPrevented属性，以判断event.preventDefault()方法是否被调用；</li>
<li>element.dataset属性可以用来获取或者修改HTML元素的”data-”前缀属性；</li>
<li>DOM3 CustomEvent规范实现；</li>
<li>清除浏览器cookie的时候也会清掉Flash的cookie。</li>
</ol>
<p>当然，Firefox6最终可能会有变数，这里仅供参考。更多内容可以查</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/300/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox 火狐 5 十大新功能</title>
		<link>http://www.billy.net.cn/index.php/archives/286</link>
		<comments>http://www.billy.net.cn/index.php/archives/286#comments</comments>
		<pubDate>Mon, 27 Jun 2011 15:02:48 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[5]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[十大]]></category>
		<category><![CDATA[新功能]]></category>
		<category><![CDATA[火狐]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=286</guid>
		<description><![CDATA[&#160; 据国外媒体报道，在我们享受Firefox 4新功能的时候，Mozilla已经准备在6月21日发布Firefox 5。 根据Mozilla的计划，Firefox浏览器的开发速度将提速。此举与Google对Chrome浏览器的做法相似，以此可在数月内推出一个新版Firefox浏览器，而Mozilla以前只能每两年推出一版Firefox。 下面，让我们来看下Firefox 5将添加的新功能： 任务栏网站固定 &#160; &#160; IE9最好的功能之一是任务栏网站固定，Firefox 5似乎也将添加类似的功能。新功能意味着用户可以把喜爱网站添加到任务栏，需要时可以从任务栏直接打开网站。 固定图标功能选项 &#160; &#160; 除了网站固定功能，Firefox任务栏固定图标还可以显示一些功能选项。例如，Facebook固定图标可以显示信息提示和朋友状态更新等。 多彩搜索栏 &#160; &#160; 搜索引擎配色方案可以让用户迅速区分不同的搜索工具，用户可以根据自己的需要方便地选择搜索引擎。<a href="http://www.billy.net.cn/index.php/archives/286" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>据国外媒体报道，在我们享受Firefox 4新功能的时候，Mozilla已经准备在6月21日发布Firefox 5。</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150251gfC.jpg" border="0" alt="" width="324" height="244" /></p>
<p><span id="more-286"></span></p>
<p>根据Mozilla的计划，Firefox浏览器的开发速度将提速。此举与Google对Chrome浏览器的做法相似，以此可在数月内推出一个新版Firefox浏览器，而Mozilla以前只能每两年推出一版Firefox。</p>
<p>下面，让我们来看下Firefox 5将添加的新功能：</p>
<p><strong>任务栏网站固定</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150301vRB.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>IE9最好的功能之一是任务栏网站固定，Firefox 5似乎也将添加类似的功能。新功能意味着用户可以把喜爱网站添加到任务栏，需要时可以从任务栏直接打开网站。</p>
<p><strong>固定图标功能选项</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150302rSY.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>除了网站固定功能，Firefox任务栏固定图标还可以显示一些功能选项。例如，Facebook固定图标可以显示信息提示和朋友状态更新等。</p>
<p><strong>多彩搜索栏</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150304ojn.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>搜索引擎配色方案可以让用户迅速区分不同的搜索工具，用户可以根据自己的需要方便地选择搜索引擎。</p>
<p><strong>新的同步功能</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/1503059ek.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>Mozilla已经意识到同步功能的重要性，Firefox 5的同步功能将进一步得以改进。对于用户而言，出色的同步功能可以极大地方便跨平台使用浏览器。</p>
<p><strong>插件更新</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/1503065aH.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>插件是Firefox浏览器的一大特色，但新版Firefox在插件更新和兼容方面还存在困难。从上图可以看出，Mozilla将允许Firefox用户统一升级浏览器插件。</p>
<div>
<p><strong>移除主按钮</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150307DIW.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>据科技博客Conceivably Tech报道，Mozilla可能会移除主按钮，转而使用一个小的主标签页。</p>
<p><strong>PDF</strong><strong>阅读器</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150308OSS.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>Firefox 5还将兼容更多的文件格式。科技博客Conceivably Tech称，　Firefox 5将内置PDF阅读器，并且支持MP3等流行文件格式。</p>
<p><strong>多帐户登录</strong><strong> </strong></p>
<p>&nbsp;</p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150309gEQ.jpg" border="0" alt="" /></p>
<p>&nbsp;</p>
<p>科技博客Conceivably Tech还报道，Firefox 5将内置一个身份管理器，记录用户的网站登录信息，设置还允许用户使用不同帐户同时登录一个网站。</p>
<p><strong>社会化共享</strong><strong> </strong></p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/1503113Zp.jpg" border="0" alt="" /></p>
<p>地址栏新增一个社会化共享图标，用户通过该图标可以在Facebook, Twitter和Digg等社交网站共享信息。</p>
<p><strong>文件上传指示器</strong><strong> </strong></p>
<p><img src="http://www.billy.net.cn/wp-content/uploads/images/2011/06/150312Nd7.jpg" border="0" alt="" /></p>
<p>当用户上传文件到网站时，Firefox 5会弹出一个小的状态栏。</p>
<p>转自：http://news.newhua.com/news/2011/0412/119834.shtml</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/286/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改 Prestashop 1.3/1.4 footer 的 Powered By Prestashop 链接</title>
		<link>http://www.billy.net.cn/index.php/archives/277</link>
		<comments>http://www.billy.net.cn/index.php/archives/277#comments</comments>
		<pubDate>Mon, 27 Jun 2011 14:42:48 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[1.3]]></category>
		<category><![CDATA[1.4]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[Powered By Prestashop]]></category>
		<category><![CDATA[修改]]></category>
		<category><![CDATA[链接]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=277</guid>
		<description><![CDATA[修改 Powered By Prestashop 步骤： 1.到Prestashop 的 “modules” 文件夹，进入 “blockvariouslinks”,然后开始修改文件 prestashop 1.3 修改： prestashop/yourtheme/modules/blockvariouslinks/blockvariouslinks.tpl 如果是 prestashop 1.4 修改： prestashop/yourtheme/modules/blockcms/blockcms.tpl 2.<a href="http://www.billy.net.cn/index.php/archives/277" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>修改 Powered By Prestashop 步骤：</p>
<p>1.到Prestashop 的 “modules” 文件夹，进入 “blockvariouslinks”,然后开始修改文件</p>
<p>prestashop 1.3 修改：</p>
<p>prestashop/yourtheme/modules/blockvariouslinks/blockvariouslinks.tpl<span id="more-277"></span></p>
<p>如果是 prestashop 1.4 修改：</p>
<p>prestashop/yourtheme/modules/blockcms/blockcms.tpl</p>
<p>2. 如果你的模板文件夹里没有 “modules” 文件夹，那么你可以修改这个文件：</p>
<p>prestashop/modules/blockvariouslinks/blockvariouslinks.tpl</p>
<p>3. 你可以修改或去除 ” Powered by Prestashop” 标记。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/277/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>漂亮的花瓶</title>
		<link>http://www.billy.net.cn/index.php/archives/273</link>
		<comments>http://www.billy.net.cn/index.php/archives/273#comments</comments>
		<pubDate>Mon, 27 Jun 2011 09:28:56 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[杂谈]]></category>
		<category><![CDATA[漂亮]]></category>
		<category><![CDATA[花瓶]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=273</guid>
		<description><![CDATA[这个花瓶我喜欢 转自：http://www.jssharp.com/product.php?id_product=12]]></description>
			<content:encoded><![CDATA[<p>这个花瓶我喜欢</p>
<p><img src="http://www.jssharp.com/img/cms/T2bVxvXdhbXXXXXXXX_!!510409090.jpg" alt="" width="260" height="325" /><span id="more-273"></span></p>
<p>转自：<a href="http://www.jssharp.com/product.php?id_product=12">http://www.jssharp.com/product.php?id_product=12</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/273/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>prestashop首页添加随机商品</title>
		<link>http://www.billy.net.cn/index.php/archives/268</link>
		<comments>http://www.billy.net.cn/index.php/archives/268#comments</comments>
		<pubDate>Tue, 21 Jun 2011 13:39:06 +0000</pubDate>
		<dc:creator>billy</dc:creator>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[商品]]></category>
		<category><![CDATA[添加]]></category>
		<category><![CDATA[随机]]></category>
		<category><![CDATA[首页]]></category>

		<guid isPermaLink="false">http://www.billy.net.cn/?p=268</guid>
		<description><![CDATA[首页的模块是homefeatured，法国人经常乱命名各种模块，找一个模块要找很久。 1.2以前的版本是不支持这个功能的，我很惊奇的发现1.2.5的category类里面的getProduct增加了读取随机产品的选项，所以我们不需要自己写sql语句了。 这算是1.2版本一个不小的改动吧，prestashop从07年末开始被广泛使用以来，进步还是很大的。 把homefeatured.php的69行改成这样，就支持随机商品了。 &#160; &#160; &#160; $products = $category-&#62;getProducts(intval($params['cookie']-&#62;id_lang), 1, ($nb ? $nb : 10), NULL, NULL, false, true,<a href="http://www.billy.net.cn/index.php/archives/268" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>首页的模块是homefeatured，法国人经常乱命名各种模块，找一个模块要找很久。</p>
<p>1.2以前的版本是不支持这个功能的，我很惊奇的发现1.2.5的category类里面的getProduct增加了读取随机产品的选项，所以我们不需要自己写sql语句了。</p>
<p>这算是1.2版本一个不小的改动吧，prestashop从07年末开始被广泛使用以来，进步还是很大的。</p>
<p>把homefeatured.php的69行改成这样，就支持随机商品了。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="brush: php; gutter: true">$products = $category-&gt;getProducts(intval($params['cookie']-&gt;id_lang), 1, ($nb ? $nb : 10), NULL, NULL, false, true, true, ($nb ? $nb : 10));</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.billy.net.cn/index.php/archives/268/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

