<?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>任鸟飞网页设计博客-关注网页设计、网站开发、图形图像设计、互联网趣味信息及搜素引擎的IT原创博客 &#187; PHP</title>
	<atom:link href="http://www.renniaofei.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.renniaofei.com</link>
	<description>任鸟飞网页设计博客-关注网页设计、网站开发、图形图像设计、互联网趣味信息及搜素引擎的IT原创博客</description>
	<lastBuildDate>Fri, 30 Jul 2010 10:51:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>提高Wordpress安全性必须掌握的5种方法</title>
		<link>http://www.renniaofei.com/code/top-5-wordpress-security-tips/</link>
		<comments>http://www.renniaofei.com/code/top-5-wordpress-security-tips/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 11:41:44 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[Datebase]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[WordPress 教程]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=1180</guid>
		<description><![CDATA[WordPress是一种使用 PHP 语言开发的博客平台，用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。全球大约有20%的用户在使用 Wordpress，其中包括 yahoo，BBC 等。
随着用户的增加，其安全性也日渐提上日程，这里整理了5条提高 Wordpress 安全性的建议供参考。
1. 尽量避免使用admin用户
admin 是安装 Wordpress 时产生的管理员用户，拥有所有权限，在安装 Wordpress 时，尽量将 admin 对应的密码设置的复杂一些。
2. 将wp-config.php移动到其他目录
如果根目录下没有找到wp-config.php，Wordpress会自动寻找其他目录。
3. 更改Wordpress数据库中的表名前缀
在安装 Wordpress 时，默认会将数据库中的表名前缀设置为“wp_”，应尽量修改此前缀。如果 wordpress 已安装完毕，可以利用这个插件 WP Security Scan  来设置。
4. 使用密钥 Secret Keys
访问 http://api.wordpress.org/secret-key/1.1/ ，生成4组密钥，将此4组密钥复制到 wp-config.php。
5.使用 .htaccess
可以限制其他用户访问 wp-admin 目录，我们可以利用下面的代码来指定允许某些特定的IP访问此目录。
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Access Control"
AuthType Basic
order deny,allow
deny from all
#IP address to Whitelist
allow from xxx.xxx.xxx.xxx
说明：如果需要指定多个IP，可以重复“allow from xxx.xxx.xxx.xxx”（不含引号）即可。
]]></description>
			<content:encoded><![CDATA[<p>WordPress是一种使用 <a href="http://www.renniaofei.com/tag/php/">PHP</a> 语言开发的博客平台，用户可以在支持 <a href="http://www.renniaofei.com/tag/php/">PHP</a> 和 <a href="http://www.renniaofei.com/tag/datebase/">MySQL</a> 数据库的服务器上架设自己的博客。全球大约有20%的用户在使用 <a href="http://www.renniaofei.com/">Wordpress</a>，其中包括 yahoo，BBC 等。<span id="more-1180"></span><br />
随着用户的增加，其安全性也日渐提上日程，这里整理了5条提高 Wordpress 安全性的建议供参考。</p>
<h4>1. 尽量避免使用admin用户</h4>
<p>admin 是安装 Wordpress 时产生的管理员用户，拥有所有权限，在安装 Wordpress 时，尽量将 admin 对应的密码设置的复杂一些。</p>
<h4>2. 将wp-config.php移动到其他目录</h4>
<p>如果根目录下没有找到wp-config.php，Wordpress会自动寻找其他目录。</p>
<h4>3. 更改Wordpress数据库中的表名前缀</h4>
<p>在安装 Wordpress 时，默认会将数据库中的表名前缀设置为“wp_”，应尽量修改此前缀。如果 wordpress 已安装完毕，可以利用这个插件 <a href="http://wordpress.org/extend/plugins/wp-security-scan/" target="_blank">WP Security Scan</a>  来设置。</p>
<h4>4. 使用密钥 Secret Keys</h4>
<p>访问 <a href="http://api.wordpress.org/secret-key/1.1/ ">http://api.wordpress.org/secret-key/1.1/</a> ，生成4组密钥，将此4组密钥复制到 wp-config.php。</p>
<h4>5.使用 .htaccess</h4>
<p>可以限制其他用户访问 wp-admin 目录，我们可以利用下面的代码来指定允许某些特定的IP访问此目录。</p>
<pre><code>AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName "Access Control"
AuthType Basic
order deny,allow
deny from all
#IP address to Whitelist
allow from xxx.xxx.xxx.xxx</code></pre>
<p>说明：如果需要指定多个IP，可以重复“allow from xxx.xxx.xxx.xxx”（不含引号）即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/top-5-wordpress-security-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用PHP备份MySQL数据库</title>
		<link>http://www.renniaofei.com/code/using-php-to-backup-mysql-databases/</link>
		<comments>http://www.renniaofei.com/code/using-php-to-backup-mysql-databases/#comments</comments>
		<pubDate>Tue, 04 May 2010 14:50:36 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[Datebase]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=949</guid>
		<description><![CDATA[在网站运营和维护过程中，需要定期对数据进行备份，网站建站方案最经典的搭配组合就是Apache+MySQL+PHP。

使用PHP备份MySQL数据库方法

PHP编程，执行数据库查询备份语句。
使用system() 函数。
使用phpMyAdmin。

一. PHP编程，执行数据库查询备份语句
使用 SELECT INTO OUTFILE  备份数据
&#60;?php
include 'config.php';
include 'opendb.php';

$tableName  = 'mypet';
$backupFile = 'backup/mypet.sql';
$query      = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName";
$result = mysql_query($query);

include 'closedb.php';
?&#62;
使用 LOAD DATA INFILE  来恢复数据
&#60;?php
include 'config.php';
include 'opendb.php';
$tableName  = 'mypet';
$backupFile = 'mypet.sql';
$query      = "LOAD DATA INFILE 'backupFile' INTO TABLE $tableName";
$result = [...]]]></description>
			<content:encoded><![CDATA[<p>在网站运营和维护过程中，需要定期对数据进行备份，网站建站方案最经典的搭配组合就是Apache+MySQL+PHP。<br />
<span id="more-949"></span></p>
<h4>使用PHP备份MySQL数据库方法</h4>
<ol>
<li>PHP编程，执行数据库查询备份语句。</li>
<li>使用system() 函数。</li>
<li>使用phpMyAdmin。</li>
</ol>
<h4>一. PHP编程，执行数据库查询备份语句</h4>
<p>使用 SELECT INTO OUTFILE  备份数据</p>
<pre><code>&lt;?php
include 'config.php';
include 'opendb.php';

$tableName  = 'mypet';
$backupFile = 'backup/mypet.sql';
$query      = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName";
$result = mysql_query($query);

include 'closedb.php';
?&gt;</code></pre>
<p>使用 LOAD DATA INFILE  来恢复数据</p>
<pre><code>&lt;?php
include 'config.php';
include 'opendb.php';
$tableName  = 'mypet';
$backupFile = 'mypet.sql';
$query      = "LOAD DATA INFILE 'backupFile' INTO TABLE $tableName";
$result = mysql_query($query);
include 'closedb.php';
?&gt;</code></pre>
<h4>二. 使用system() 函数</h4>
<p>使用MySQL自带的 system()函数执行外部命令（command）。</p>
<pre><code>&lt;?php
include 'config.php';
include 'opendb.php';
$backupFile = $dbname . date("Y-m-d-H-i-s") . '.gz';
$command = "mysqldump --opt -h $dbhost -u $dbuser -p $dbpass $dbname | gzip &gt; $backupFile";
system($command);
include 'closedb.php';
?&gt;</code></pre>
<h4>三. 使用phpMyAdmin</h4>
<p>要想使用phpMyAdmin备份数据的前提是你必须等安装它才行。<a href="http://www.phpmyadmin.net/">phpMyAdmin 下载地址</a></p>
<p>具体步骤：phpMyAdmin主页 / 导出 / 选择需要导出的数据表 /选项默认即可 / 执行</p>
<p><a href="http://www.php-mysql-tutorial.com/wikis/mysql-tutorials/default.aspx">来源</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/using-php-to-backup-mysql-databases/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化SQL语句，提高数据库执行效率的8条建议</title>
		<link>http://www.renniaofei.com/code/8-useful-tips-to-optimize-and-speed-up-your-website-database/</link>
		<comments>http://www.renniaofei.com/code/8-useful-tips-to-optimize-and-speed-up-your-website-database/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 17:53:14 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[Datebase]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=625</guid>
		<description><![CDATA[网站（动态）的数据一般情况下都会存储在数据库中（例如MS SQL、My SQL等），当用户访问网站时，会根据一些缺省的或用户提交的参数（比如网址后面可能会带有”index.php?cat=design” ）来查询或更新数据库，虽然数据库的运行速度很快，但在一些不恰当的数据库操作的情况下，会增加数据库运行占用的系统资源，严重时可能会拖垮整个数据库的运行。

下面汇总了10条常见的SQL语句问题点及优化建议
1.  尽量减少 * 的使用，只查询你需要的字段内容。
优化前：
SELECT * FROM wp_posts;
优化后：
SELECT title, excerpt, author FROM wp_posts;
2. 记得使用 LIMIT ， 限制查询的数量。
优化后：
SELECT title, excerpt, author FROM wp_posts LIMIT 10;
LIMIT 的使用方法：
LIMIT OFFSET,NUMBER ； offset代表偏移量，number代表从offset开始查询的数量。
例如：
LIMIT 10 ； 代表偏移量为0，查询条数为10条。
LIMIT 10,12 ; 代表偏移量为10，查询条数为12条。
3. 避免在程序语言的循环语句（例如 PHP 的foreach、while 等）中使用SQL语句
优化前:
foreach ($display_order as $id =&#62; $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal WHERE [...]]]></description>
			<content:encoded><![CDATA[<p>网站（动态）的数据一般情况下都会存储在数据库中（例如MS SQL、My SQL等），当用户访问网站时，会根据一些缺省的或用户提交的参数（比如网址后面可能会带有”index.php?cat=design” ）来查询或更新数据库，虽然数据库的运行速度很快，但在一些不恰当的数据库操作的情况下，会增加数据库运行占用的系统资源，严重时可能会拖垮整个数据库的运行。<br />
<span id="more-625"></span><br />
下面汇总了10条常见的SQL语句问题点及优化建议</p>
<h4>1.  尽量减少 * 的使用，只查询你需要的字段内容。</h4>
<p>优化前：</p>
<pre><code>SELECT * FROM wp_posts;</code></pre>
<p>优化后：</p>
<pre><code>SELECT title, excerpt, author FROM wp_posts;</code></pre>
<h4>2. 记得使用 LIMIT ， 限制查询的数量。</h4>
<p>优化后：</p>
<pre><code>SELECT title, excerpt, author FROM wp_posts LIMIT 10;</code></pre>
<p>LIMIT 的使用方法：<br />
LIMIT OFFSET,NUMBER ； offset代表偏移量，number代表从offset开始查询的数量。<br />
例如：<br />
LIMIT 10 ； 代表偏移量为0，查询条数为10条。<br />
LIMIT 10,12 ; 代表偏移量为10，查询条数为12条。</p>
<h4>3. 避免在程序语言的循环语句（例如 PHP 的foreach、while 等）中使用SQL语句</h4>
<p>优化前:</p>
<pre><code>foreach ($display_order as $id =&gt; $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";}</code></pre>
<p>优化后：</p>
<pre><code>UPDATE categories
SET display_order =   CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)</code></pre>
<p>具体请参考：<a href="http://www.renniaofei.com/code/update-multiple-rows-with-different-values-and-a-single-sql-query/">如何在数据库中一次更新多行多字段</a></p>
<h4>4. 使用join代替子查询（subqueries）语句</h4>
<p>优化前：</p>
<pre><code>SELECT a.id,
(SELECT MAX(created)
FROM posts
WHERE author_id = a.id)
AS latest_post FROM authors a</code></pre>
<p>优化后：</p>
<pre><code>SELECT a.id, MAX(p.created) AS latest_post
FROM authors a
INNER JOIN posts p
ON (a.id = p.author_id)
GROUP BY a.id </code></pre>
<h4>5. 尽量减少通配符的使用，特别是前缀通配符（通配符放在前面）</h4>
<pre><code>#Full wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE '%hello%';
#Postfix wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE  'hello%';
#Prefix wildcard
SELECT * FROM TABLE WHERE COLUMN LIKE  '%hello';</code></pre>
<h4>6. 使用union代替or查询语句</h4>
<p>优化前：</p>
<pre><code>SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y;</code></pre>
<p>优化后</p>
<pre><code>SELECT * FROM a, b WHERE a.p = b.q
UNION
SELECT * FROM a, b WHERE a.x = b.y</code></pre>
<h4>7. 记得使用索引（index）</h4>
<pre><code>CREATE INDEX idxModel ON Product (Model);</code></pre>
<h4>8. 用&gt;=替代&gt;</h4>
<p>优化前：</p>
<pre><code>SELECT * FROM EMP WHERE DEPTNO &gt;3</code></pre>
<p>优化后：</p>
<pre><code>SELECT * FROM EMP WHERE DEPTNO &gt;=4</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/8-useful-tips-to-optimize-and-speed-up-your-website-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何在数据库中一次更新多行多字段</title>
		<link>http://www.renniaofei.com/code/update-multiple-rows-with-different-values-and-a-single-sql-query/</link>
		<comments>http://www.renniaofei.com/code/update-multiple-rows-with-different-values-and-a-single-sql-query/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 07:06:22 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=611</guid>
		<description><![CDATA[数据库操作中经常会遇到需要更新多个行、多个字段的操作，这里介绍一种结构清晰的SQL语句，以期能提高数据库操作效率，并尽可能降低系统资源的消耗。

我们先看一个常见的SQL UPDATE语句的写法：
UPDATE mytable SET   myfield = 'value' WHERE other_field = 'other_value';
在更新多行操作，常见的SQL UPDATE写法可能如下所示（PHP环境下）：
foreach ($display_order   as $id =&#62; $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal   WHERE id = $id";
mysql_query($sql);
}
上述代码虽然也能达到我们期待的结果，但很显然，上述代码多次执行数据库更新（UPDATE）操作，当更新行数较多时，将严重占用系统资源。
改进后的数据库更新（UPDATE）操作
UPDATE mytable
 SET myfield = CASE   other_field
 WHEN 1 THEN 'value'
 WHEN 2 THEN 'value'
 WHEN 3 THEN 'value'
END
 [...]]]></description>
			<content:encoded><![CDATA[<p>数据库操作中经常会遇到需要更新多个行、多个字段的操作，这里介绍一种结构清晰的SQL语句，以期能提高数据库操作效率，并尽可能降低系统资源的消耗。<br />
<span id="more-611"></span></p>
<h4>我们先看一个常见的SQL UPDATE语句的写法：</h4>
<pre><code>UPDATE mytable SET   myfield = 'value' WHERE other_field = 'other_value';</code></pre>
<h4>在更新多行操作，常见的SQL UPDATE写法可能如下所示（PHP环境下）：</h4>
<pre><code>foreach ($display_order   as $id =&gt; $ordinal) {
$sql = "UPDATE categories SET display_order = $ordinal   WHERE id = $id";
mysql_query($sql);
}</code></pre>
<p>上述代码虽然也能达到我们期待的结果，但很显然，上述代码多次执行数据库更新（UPDATE）操作，当更新行数较多时，将严重占用系统资源。</p>
<h4>改进后的数据库更新（UPDATE）操作</h4>
<pre><code>UPDATE mytable
 SET myfield = CASE   other_field
 WHEN 1 THEN 'value'
 WHEN 2 THEN 'value'
 WHEN 3 THEN 'value'
END
 WHERE id IN (1,2,3)</code></pre>
<p>经过改进后的上述代码也能实现更新多行的目标，而且更新操作是在一条更新语句中完成，大大降低了数据库更新操作占用的系统资源。</p>
<p><strong>代码说明：</strong></p>
<p>SET myfield = CASE   other_field  &#8211; 使用CASE语句代替具体的字段值。<br />
WHEN 1 THEN &#8216;value&#8217;  &#8211; 根据条件（在本例中的判断条件就是id）更新对应的字段.<br />
WHERE id IN (1,2,3)  &#8211; 指定查询范围，可省略（不推荐） 。</p>
<p><strong>示例</strong></p>
<pre><code>UPDATE categories
SET display_order =   CASE id
 WHEN 1 THEN 3
 WHEN 2 THEN 4
 WHEN 3 THEN 5
END
 WHERE id IN (1,2,3)</code></pre>
<p><strong>更新多行多字段的SQL UPDATE语句，只要相应的增加CASE语句即可。</strong></p>
<pre><code>
UPDATE categories
 SET display_order =   CASE id
 WHEN 1 THEN 3
 WHEN 2 THEN 4
 WHEN 3 THEN 5
END,
 title = CASE id
 WHEN 1 THEN 'New   Title 1'
 WHEN 2 THEN 'New   Title 2'
 WHEN 3 THEN 'New   Title 3'
END
 WHERE id IN (1,2,3)</code></pre>
<h4>在实际应用中可以参考如下代码（PHP环境下）:</h4>
<pre><code>//新建一个数组display_order， 按键值的方式给数组初始化（category ids 作为键 ，赋予新的次序）
 $display_order = array(
 1 =&gt; 4,
 2 =&gt; 1,
 3 =&gt; 2,
 4 =&gt; 3,
 5 =&gt; 9,
 6 =&gt; 5,
 7 =&gt; 8,
 8 =&gt; 9
);
 $ids = implode(',', array_keys($display_order));
 $sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id =&gt; $ordinal) {
 $sql .= sprintf("WHEN   %d THEN %d ", $id,   $ordinal);
}
 $sql .= "END WHERE id IN ($ids)";
 echo $sql;</code></pre>
<p>运用上述方法，在更新成千上万行的数据时，将大大提高数据库操作效率，并降低系统资源消耗。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/update-multiple-rows-with-different-values-and-a-single-sql-query/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>利用.htaccess的URL重写（url rewriting）功能实现网站页面伪静态-Apache HTTP Server</title>
		<link>http://www.renniaofei.com/tools/htaccess-url-rewriting-examples-htaccess/</link>
		<comments>http://www.renniaofei.com/tools/htaccess-url-rewriting-examples-htaccess/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 07:22:52 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[工具]]></category>
		<category><![CDATA[编码]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=529</guid>
		<description><![CDATA[URL重写 (URL Rewriting) 是一种REST的相关技术，它可以在 Web Server 中，针对用户所提供的 URL 进行转换后，再传入 Web Server 中的程序处理器.

最常见的用法，就是将一组 URL 层次结构字符串，转换成带有 query string 的 URL，例如：
lihttp://www.renniaofei.com/single.php?cat=code&#38;name=url-rewriting
经过 URL 重写后，可以变成：
http://www.renniaofei.com/code/url-rewriting/
URL重写 (URL Rewriting)的优点：

URL友好，方便用户使用，提高用户体验。
有利于搜索引擎的优化，并且比生成静态更加方便。
 应用程序开发者可以利用这个机制来将参数隐藏起来，可避免让网络上的恶意用户收集到利于发动攻击的信息。

URL重写 (URL Rewriting)的一个简单示例
将product.php?id=12 重写为 product-12.html
.htaccess代码如下：
RewriteEngine on
RewriteRule ^product-([0-9]+)\.html$ product.php?id=$1
URL重写 (URL Rewriting)模块说明
Apache HTTP Server / Module mod_rewrite
/ URL Rewriting Engine
具体配置说明（Configuration Directives）请参考官方网站（http://httpd.apache.org），具体包括下面9个方面（一般情况下只需要配置粗体字部分即可）：

RewriteEngine
RewriteOptions
RewriteLog
RewriteLogLevel
RewriteLock
RewriteMap
RewriteBase
RewriteCond
RewriteRule

下面对上面粗体字部分做简单说明：
1. rewriteEngine： On &#124; Off ，默认值为Off，打开或关闭rewrite功能。
rewrite configurations 不会继承，所以你得给每个你想用 rewrite功能的virtual host加上这个指令。
7. RewriteBase URL-path ，显式地设置了目录级重写的基准URL。
RewriteRule可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用，即规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后，这个路径会被自动地附着回去。默认值是&#8221;RewriteBase physical-directory-path&#8221;。
在对一个新的URL进行替换时，此模块必须把这个URL重新注入到服务器处理中。为此，它必须知道其对应的URL前缀或者说URL基准。通常，此前缀就是对应的文件路径。但是，大多数网站URL不是直接对应于其物理文件路径的，因而一般不能做这样的假定! 所以在这种情况下，就必须用RewriteBase指令来指定正确的URL前缀。
如果你的网站服务器URL不是与物理文件路径直接对应的，而又需要使用RewriteBase指令，则必须在每个对应的.htaccess文件中指定 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>URL重写 (URL Rewriting) </strong>是一种REST的相关技术，它可以在 Web Server 中，针对用户所提供的 URL 进行转换后，再传入 Web Server 中的程序处理器.<br />
<span id="more-529"></span><br />
最常见的用法，就是将一组 URL 层次结构字符串，转换成带有 query string 的 URL，例如：</p>
<p>lihttp://www.renniaofei.com/single.php?cat=code&amp;name=url-rewriting</p>
<p>经过 URL 重写后，可以变成：</p>
<p>http://www.renniaofei.com/code/url-rewriting/</p>
<h4>URL重写 (URL Rewriting)的优点：</h4>
<ol>
<li>URL友好，方便用户使用，提高用户体验。</li>
<li>有利于搜索引擎的优化，并且比生成静态更加方便。</li>
<li> 应用程序开发者可以利用这个机制来将参数隐藏起来，可避免让网络上的恶意用户收集到利于发动攻击的信息。</li>
</ol>
<h4>URL重写 (URL Rewriting)的一个简单示例</h4>
<p>将product.php?id=12 重写为 product-12.html</p>
<p>.htaccess代码如下：</p>
<pre><code>RewriteEngine on
RewriteRule ^product-([0-9]+)\.html$ product.php?id=$1</code></pre>
<h4>URL重写 (URL Rewriting)模块说明</h4>
<p>Apache HTTP Server / Module mod_rewrite<br />
/ URL Rewriting Engine</p>
<p>具体配置说明（Configuration Directives）请参考官方网站（http://httpd.apache.org），具体包括下面9个方面（一般情况下只需要配置粗体字部分即可）：</p>
<ol>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteEngine"><strong>RewriteEngine</strong></a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteOptions">RewriteOptions</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteLog">RewriteLog</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteLogLevel">RewriteLogLevel</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteLock">RewriteLock</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteMap">RewriteMap</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteBase"><strong>RewriteBase</strong></a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteCond"><strong>RewriteCond</strong></a></li>
<li><a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html#RewriteRule"><strong>RewriteRule</strong></a></li>
</ol>
<p><strong>下面对上面粗体字部分做简单说明：</strong></p>
<p>1. rewriteEngine： <em>On | <strong>Off</strong></em> ，默认值为Off，打开或关闭rewrite功能。</p>
<p>rewrite configurations 不会继承，所以你得给每个你想用 rewrite功能的virtual host加上这个指令。</p>
<p>7. RewriteBase <em>URL-path </em>，显式地设置了目录级重写的基准URL。</p>
<p>RewriteRule可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用，即规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后，这个路径会被自动地附着回去。默认值是&#8221;RewriteBase physical-directory-path&#8221;。<br />
在对一个新的URL进行替换时，此模块必须把这个URL重新注入到服务器处理中。为此，它必须知道其对应的URL前缀或者说URL基准。通常，此前缀就是对应的文件路径。但是，大多数网站URL不是直接对应于其物理文件路径的，因而一般不能做这样的假定! 所以在这种情况下，就必须用RewriteBase指令来指定正确的URL前缀。<br />
如果你的网站服务器URL不是与物理文件路径直接对应的，而又需要使用RewriteBase指令，则必须在每个对应的.htaccess文件中指定 RewriteRule 。</p>
<p>8. RewriteCond <em>TestString CondPattern</em> ，定义了一个规则的条件。</p>
<p>9. RewriteRule <em>Pattern Substitution [flags]</em> 。</p>
<p><strong>正则表达式常用语法（regular expressions）：</strong></p>
<pre>Text:
  .           任何单字符
  [chars]     Character class: One  of chars
  [^chars]    Character class: None of chars
  text1|text2 两者选一个: text1 or text2

Quantifiers:量词
  ?           0 or 1 of the 前面的 text
  *           0 or N of the 前面的 text (N &gt; 0)
  +           1 or N of the 前面的 text (N &gt; 1)

Grouping:
  (text)      Grouping of text

可用$N来得到()中的内容:
 ( (a|b) | (c|d))
$1 $2      $3  

Anchors:
  ^           Start of line anchor
  $           End   of line anchor

Escaping:
  \char       escape that particular char
              (for instance to specify the chars ".[]()" etc.)

注意：没有并且&amp;
</pre>
<p><strong>flags</strong></p>
<ol>
<li>
<h4>&#8216;redirect|R [=code]&#8216; (强制重定向 redirect)</h4>
<p>以http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定，则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码，只需在此指定这个数值即可， 另外，还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端，如, 重写&#8220;/~&#8221;为 &#8220;/u/&#8221;，或对/u/user加上斜杠，等等。</p>
<p>注意: 在使用这个标记时，必须确保该替换字段是一个有效的URL! 否则，它会指向一个无效的位置! 并且要记住，此标记本身只是对URL加上 http://thishost[:thisport]/的前缀，重写操作仍然会继续。 通常，你会希望停止重写操作而立即重定向，则还需要使用&#8217;L'标记.</li>
<li>
<h4>&#8216;forbidden|F&#8217; (强制URL为被禁止的 forbidden)</h4>
<p>强制当前URL为被禁止的，即，立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记，可以链接若干RewriteConds以有条件地阻塞某些URL。</li>
<li>
<h4>&#8216;gone|G&#8217; (强制URL为已废弃的 gone)</h4>
<p>强制当前URL为已废弃的，即，立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记，可以标明页面已经被废弃而不存在了.</li>
<li>
<h4>&#8216;proxy|P&#8217; (强制为代理 proxy)</h4>
<p>此标记使替换成分被内部地强制为代理请求，并立即(即， 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。 使用这个标记，可以把某些远程成分映射到本地服务器名称空间， 从而增强了ProxyPass指令的功能。<br />
注意: 要使用这个功能，代理模块必须编译在Apache服务器中。 如果你不能确定，可以检查&#8220;httpd -l&#8221;的输出中是否有mod_proxy.c。 如果有，则mod_rewrite可以使用这个功能； 如果没有，则必须启用mod_proxy并重新编译&#8220;httpd&#8221;程序。</li>
<li>
<h4>&#8216;last|L&#8217; (最后一个规则 last)</h4>
<p>立即停止重写操作，并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例，使用它可以重写根路径的URL(&#8216;/&#8217;)为实际存在的URL, 比如, &#8216;/e/www/&#8217;.</li>
<li>
<h4>&#8216;next|N&#8217; (重新执行 next round)</h4>
<p>重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了，而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作，即, 立即回到循环的头部。<br />
但是要小心，不要制造死循环!</li>
<li>
<h4>&#8216;chain|C&#8217; (与下一个规则相链接 chained)</h4>
<p>此标记使当前规则与下一个(其本身又可以与其后继规则相链接的， 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配，通常会继续处理其后继规则， 即，这个标记不起作用；如果规则不能被匹配， 则其后继的链接的规则会被忽略。比如，在执行一个外部重定向时， 对一个目录级规则集，你可能需要删除&#8220;.www&#8221; (此处不应该出现&#8220;.www&#8221;的)。</li>
<li>
<h4>&#8216;type|T=MIME-type&#8217; (强制MIME类型 type)</h4>
<p>强制目标文件的MIME类型为MIME-type。 比如，它可以用于模拟mod_alias中的ScriptAlias指令， 以内部地强制被映射目录中的所有文件的MIME类型为&#8220;application/x-httpd-cgi&#8221;.</li>
<li>
<h4>&#8216;nosubreq|NS&#8217; (仅用于不对内部子请求进行处理 no internal sub-request)</h4>
<p>在当前请求是一个内部子请求时，此标记强制重写引擎跳过该重写规则。 比如，在mod_include试图搜索可能的目录默认文件(index.xxx)时， Apache会内部地产生子请求。对子请求，它不一定有用的，而且如果整个规则集都起作用， 它甚至可能会引发错误。所以，可以用这个标记来排除某些规则。</p>
<p>根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀，以强制它们由CGI脚本处理， 而对子请求处理的出错率(或者开销)很高，在这种情况下，可以使用这个标记。</li>
<li>
<h4>&#8216;nocase|NC&#8217; (忽略大小写 no case)</h4>
<p>它使Pattern忽略大小写，即, 在Pattern与当前URL匹配时，&#8217;A-Z&#8217; 和&#8217;a-z&#8217;没有区别。</li>
<li>
<h4>&#8216;qsappend|QSA&#8217; (追加请求串 query string append)</h4>
<p>此标记强制重写引擎在已有的替换串中追加一个请求串，而不是简单的替换。 如果需要通过重写规则在请求串中增加信息，就可以使用这个标记。</li>
<li>
<h4>&#8216;noescape|NE&#8217; (在输出中不对URI作转义 no URI escaping)</h4>
<p>此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下，特殊字符(如&#8217;%', &#8216;$&#8217;, &#8216;;&#8217;等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义，以允许百分号等符号出现在输出中，如：<br />
RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]</p>
<p>可以使&#8217;/foo/zed&#8217;转向到一个安全的请求&#8217;/bar?arg=P1=zed&#8217;.</li>
<li>
<h4>&#8216;passthrough|PT&#8217; (移交给下一个处理器 pass through)</h4>
<p>此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值，它只是一个小修改，使之能对来自其他URI到文件名翻译器的 Alias，ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子： 如果要通过mod_rewrite的重写引擎重写/abc为/def， 然后通过mod_alias使/def转变为/ghi，可以这样:<br />
RewriteRule ^/abc(.*) /def$1 [PT]</p>
<p>Alias /def /ghi</p>
<p>如果省略了PT标记，虽然mod_rewrite运作正常， 即, 作为一个使用API的URI到文件名翻译器， 它可以重写uri=/abc/&#8230;为filename=/def/&#8230;， 但是，后续的mod_alias在试图作URI到文件名的翻译时，则会失效。</p>
<p>注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时， 就必须使用这个标记。混合使用mod_alias和mod_rewrite就是个典型的例子。</p>
<p>For Apache hackers</p>
<p>如果当前Apache API除了URI到文件名hook之外，还有一个文件名到文件名的hook， 就不需要这个标记了! 但是，如果没有这样一个hook，则此标记是唯一的解决方案。 Apache Group讨论过这个问题，并在Apache 2.0 版本中会增加这样一个hook。</li>
<li>
<h4>&#8217;skip|S=num&#8217; (跳过后继的规则 skip)</h4>
<p>此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句，而被跳过的skip=N个规则是else从句. (它和&#8217;chain|C&#8217;标记是不同的!)</li>
<li>
<h4>&#8216;env|E=VAR:VAL&#8217; (设置环境变量 environment variable)</h4>
<p>此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用，但通常是在XSSI (via or CGI (如 $ENV{&#8216;VAR&#8217;})中， 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。</li>
<li>
<h4>&#8216;cookie|CO=NAME:VAL:domain[:lifetime[:path]]&#8217; (设置cookie)</h4>
<p>它在客户端浏览器上设置一个cookie。 cookie的名称是NAME，其值是VAL。 domain字段是该cookie的域，比如&#8217;.apache.org&#8217;, 可选的lifetime是cookie生命期的分钟数， 可选的path是cookie的路径。</li>
</ol>
<h4>Url Rewriting 实例：</h4>
<p><strong>1. 下载链接伪静态</strong></p>
<pre><code>RewriteEngine on
          RewriteRule ^files/([^/]+)/([^/]+).zip   /download.php?section=$1&amp;file=$2 [NC]
       重写后的url：http://mysite/files/games/hoopy.zip</code></pre>
<p><strong>2. url简化 </strong></p>
<pre><code> RewriteEngine On
          RewriteRule ^grab /public/files/download/download.php</code></pre>
<p>服务器端地址：http://mysite/public/files/download/download.php?file=my.zip</p>
<p>转化后url：http://mysite/grab?file=my.zip</p>
<p><strong>3. $_GET变量捕捉更换 </strong></p>
<pre><code>RewriteEngine On
          RewriteCond %{QUERY_STRING} foo=(.*)
          RewriteRule ^grab(.*) /page.php?bar=%1</code></pre>
<p>服务器端地址：</p>
<p>http://domain.com/page.php?bar=bar</p>
<p>URL转化后：</p>
<p>http://domain.com/grab?foo=bar</p>
<p><strong>4. 域名指向新文件 </strong></p>
<pre><code>RewriteEngine On
          RewriteCond %{HTTP_HOST} ^test\.com$ [OR]
          RewriteCond %{HTTP_HOST} ^www\.test\.com$
          RewriteCond %{REQUEST_URI} !^/new/
          RewriteRule (.*)   /new/$1 </code></pre>
<p>当网站改版时，可直接使用上面代码将域名指向新版完站的文件夹。</p>
<p><strong>5. 将不带www的URL请求转向到带www的URL </strong></p>
<pre><code>RewriteEngine On
          RewriteCond %{HTTP_HOST} ^renniaofei\.com$
          RewriteRule (.*) http://www.renniaofei.com/$1 [R=301,L]</code></pre>
<p><strong>6. 防盗链功能 </strong></p>
<pre><code>RewriteEngine On
       RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
       RewriteCond %{HTTP_REFERER} !^$
       RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] </code></pre>
<p><strong>Url rewriting 在线工具</strong>：http://www.iwebtool.com/htaccess_url_rewrite</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/tools/htaccess-url-rewriting-examples-htaccess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用.htaccess实现图片防盗链</title>
		<link>http://www.renniaofei.com/design/htaccess-fang-daolian/</link>
		<comments>http://www.renniaofei.com/design/htaccess-fang-daolian/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:10:04 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=508</guid>
		<description><![CDATA[所谓盗链，是指其他网站直接链接我们网站上的文件，一般来说，盗链的对象大多为很耗带宽的大体积文件，如图片、视频等。这样造成的后果主要有：增加了服务器的流量负担，影响我们网站的访问速度。

通过.htaccess来防止网站的图片、压缩文件、或视频等非Html文件被盗链的方法相当简单，通过在该文件中加入几句命令即可保护我们宝贵的带宽。
在.htaccess中添加下面代码
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !renniaofei.com [NC]
RewriteCond %{HTTP_REFERER} !ikuaizi.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
RewriteCond %{HTTP_REFERER} !xianguo.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky.com [NC]
RewriteRule .*.(gif&#124;jpg)$ http://domain.com/no.png [R,NC,L]
对上面代码的解释说明
1、RewriteCond %{HTTP_REFERER} !^$ [NC]
允许空“HTTP_REFERER”的访问，即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言，这是可选的，不过，建议这么设置，如果强迫必须具有“HTTP_REFERER”才能访问，可能会带来某些问题，比如说在用户通过代理服务器访问时。
2、RewriteCond %{HTTP_REFERER} !domain.com [NC]
设置允许访问的HTTP来源，包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。
3、RewriteRule .*.(gif&#124;jpg&#124;png)$ http://domain.com/no.png [R,NC,L]
定义被盗链时替代的图片，让所有盗链 jpg、gif、png 等文件的网页，显示根目录下的 no.png 文件。注意：替换显示的图片不要放在设置防盗链的目录中，并且该图片文件体积越小越好。当然你也可以不设置替换图片，而是使用下面的语句即可：
RewriteRule .*.(gif&#124;jpg&#124;png)$ &#8211; [F]
4、说明一下其中的R、NC 和 L
R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束，后续的转向不受先前判断语句的影响
5、防止盗链的文件类型
上例中是 gif、jpg、png，而根据需要，可更改或添加其他文件类型，如rar、mov等，不同文件扩展名间使用“&#124;”分割。
这样的话，就可以基本做到简单的防止被盗链情况的发生，而且可以尽最大可能的减少服务器流量的无畏消耗，当然了，如果你不在意这点流量的话，那么可以不用考虑上述设置啦！
功能扩展
RewriteRule .*.(gif&#124;jpg)$ [...]]]></description>
			<content:encoded><![CDATA[<p>所谓盗链，是指其他网站直接链接我们网站上的文件，一般来说，盗链的对象大多为很耗带宽的大体积文件，如图片、视频等。这样造成的后果主要有：增加了服务器的流量负担，影响我们网站的访问速度。<br />
<span id="more-508"></span><br />
通过.htaccess来防止网站的图片、压缩文件、或视频等非Html文件被盗链的方法相当简单，通过在该文件中加入几句命令即可保护我们宝贵的带宽。</p>
<h4>在.htaccess中添加下面代码</h4>
<p>RewriteEngine on<br />
RewriteCond %{HTTP_REFERER} !^$ [NC]<br />
RewriteCond %{HTTP_REFERER} !renniaofei.com [NC]<br />
RewriteCond %{HTTP_REFERER} !ikuaizi.com [NC]<br />
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]<br />
RewriteCond %{HTTP_REFERER} !xianguo.com [NC]<br />
RewriteCond %{HTTP_REFERER} !google.com [NC]<br />
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]<br />
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]<br />
RewriteCond %{HTTP_REFERER} !feedsky.com [NC]<br />
RewriteRule .*.(gif|jpg)$ http://domain.com/no.png [R,NC,L]</p>
<h4>对上面代码的解释说明</h4>
<p><span style="color: #008080;">1、RewriteCond %{HTTP_REFERER} !^$ [NC]</span><br />
允许空“HTTP_REFERER”的访问，即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言，这是可选的，不过，建议这么设置，如果强迫必须具有“HTTP_REFERER”才能访问，可能会带来某些问题，比如说在用户通过代理服务器访问时。</p>
<p><span style="color: #008080;">2、RewriteCond %{HTTP_REFERER} !domain.com [NC]</span></p>
<p>设置允许访问的HTTP来源，包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。</p>
<p><span style="color: #008080;">3、RewriteRule .*.(gif|jpg|png)$ http://domain.com/no.png [R,NC,L]</span></p>
<p>定义被盗链时替代的图片，让所有盗链 jpg、gif、png 等文件的网页，显示根目录下的 no.png 文件。注意：替换显示的图片不要放在设置防盗链的目录中，并且该图片文件体积越小越好。当然你也可以不设置替换图片，而是使用下面的语句即可：</p>
<p>RewriteRule .*.(gif|jpg|png)$ &#8211; [F]</p>
<p><span style="color: #008080;">4、说明一下其中的R、NC 和 L</span></p>
<p>R 就是转向的意思<br />
NC 指的是不区分大小写<br />
L 的作用是指明本次转向到此结束，后续的转向不受先前判断语句的影响</p>
<p><span style="color: #008080;">5、防止盗链的文件类型</span></p>
<p>上例中是 gif、jpg、png，而根据需要，可更改或添加其他文件类型，如rar、mov等，不同文件扩展名间使用“|”分割。</p>
<p>这样的话，就可以基本做到简单的防止被盗链情况的发生，而且可以尽最大可能的减少服务器流量的无畏消耗，当然了，如果你不在意这点流量的话，那么可以不用考虑上述设置啦！</p>
<h4>功能扩展</h4>
<p>RewriteRule .*.(gif|jpg)$ http://domain.com/no.png [R,NC,L] </p>
<p>他的作用是，当请求以 jpg、gif 为扩展名的文件，如果referer 字段不能匹配 http://*.renniaofei.com* 这个表达式时，服务器返回 302 状态码，重定向到 http://domain.com/no.png。为了增加流量，我们也可直接定向到自己的网站。</p>
<p>只需将<br />
RewriteRule .*.(gif|jpg)$ http://domain.com/no.png [R,NC,L] <br />
修改为<br />
RewriteRule .*.(gif|jpg)$ http://domain.com/ [R,NC,L]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/design/htaccess-fang-daolian/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>如何获取RSS Feeds订阅数</title>
		<link>http://www.renniaofei.com/code/displaying-rss-feeds-as-text/</link>
		<comments>http://www.renniaofei.com/code/displaying-rss-feeds-as-text/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 15:46:17 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[网页布局]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=451</guid>
		<description><![CDATA[RSS（简易资讯聚合）是一种消息来源格式规范，用以发布经常更新资料的网站，例如部落格文章、新闻、音讯或视讯的网摘。

在使用feedburner来生成RSS Feeds时，考虑到页面布局的需要，我们需要自定义显示RSS Feeds订阅数。
1. 新建rss.php，代码如下：
&#60;?php
//get feedburner count
$whaturl="https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=hvdesigns";

//Initialize the Curl session
$ch = curl_init();

//Set curl to return the data instead of printing it to the browser.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//Set the URL
curl_setopt($ch, CURLOPT_URL, $whaturl);

//Execute the fetch
$data = curl_exec($ch);

//Close the connection
curl_close($ch);
$xml = new SimpleXMLElement($data);
$fb = $xml-&#62;feed-&#62;entry['circulation'];
//end get feedburner count

2. 在需要显示RSS  Feed数的页面需要包含（include）rss.php
&#60;?php include("rss.php"); ?&#62;
3. 显示订阅数的代码
&#60;?php echo $fb;?&#62;
]]></description>
			<content:encoded><![CDATA[<p>RSS（简易资讯聚合）是一种消息来源格式规范，用以发布经常更新资料的网站，例如部落格文章、新闻、音讯或视讯的网摘。<br />
<span id="more-451"></span><br />
在使用feedburner来生成RSS Feeds时，考虑到页面布局的需要，我们需要自定义显示RSS Feeds订阅数。</p>
<h4>1. 新建rss.php，代码如下：</h4>
<pre><code>&lt;?php
//get feedburner count
$whaturl="https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=hvdesigns";

//Initialize the Curl session
$ch = curl_init();

//Set curl to return the data instead of printing it to the browser.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//Set the URL
curl_setopt($ch, CURLOPT_URL, $whaturl);

//Execute the fetch
$data = curl_exec($ch);

//Close the connection
curl_close($ch);
$xml = new SimpleXMLElement($data);
$fb = $xml-&gt;feed-&gt;entry['circulation'];
//end get feedburner count
</code></pre>
<h4>2. 在需要显示RSS  Feed数的页面需要包含（include）rss.php</h4>
<pre><code>&lt;?php include("rss.php"); ?&gt;</code></pre>
<h4>3. 显示订阅数的代码</h4>
<pre><code>&lt;?php echo $fb;?&gt;</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/displaying-rss-feeds-as-text/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP与Javascript易混语法及函数整理对比</title>
		<link>http://www.renniaofei.com/code/php-vs-javascript-yihun-yufa-hanshu-zhengli-duibi/</link>
		<comments>http://www.renniaofei.com/code/php-vs-javascript-yihun-yufa-hanshu-zhengli-duibi/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 05:58:16 +0000</pubDate>
		<dc:creator>任鸟飞</dc:creator>
				<category><![CDATA[编码]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.renniaofei.com/?p=347</guid>
		<description><![CDATA[由于PHP和Javascript两者的语法及函数及其相似，在使用过程中极易混淆其用法，下面以表格的形式对比整理出两者易混淆的语法及函数。




项目
PHP
Javascript




简介
PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言，常常搭配 Apache (web 服务器) 一起使用。PHP 语法非常类似于 Perl 和 C。
JavaScript 是因特网上最流行的客户端脚本语言，并且可在所有主要的浏览器中运行，比方说 Internet Explorer、 Mozilla、Firefox、Netscape、和 Opera。JavaScript 被用来改进设计、验证表单、检测浏览器、创建cookies等


实现方式
PHP 的脚本块以 &#60;?php 开始，以 ?&#62; 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。
当然，在支持简写的服务器上，您可以使用 &#60;? 和 ?&#62; 来开始和结束脚本块。
例：
&#60;?php /PHP Document…… ?&#62;
HTML 的 &#60;script&#62; 标签用于把 JavaScript 插入 HTML 页面当中。
例：
&#60;script language=&#8221;javascript&#8221;&#62;// JavaScript Document …… &#60;/script&#62;


注释
单行的注释以 // 开始
多行注释以 /* 开头，以 */ 结尾。
与PHP相同


变量
局部变量申明用var
例：
var sqlstr;
若不使用var，则此变量申明为全局变量。
例：
color=&#8221;#111&#8243;;
PHP 中的所有变量都是以 $ 符号开始的。
PHP 是一门松散类型的语言（Loosely Typed Language）,
在 [...]]]></description>
			<content:encoded><![CDATA[<p>由于PHP和Javascript两者的语法及函数及其相似，在使用过程中极易混淆其用法，下面以表格的形式对比整理出两者易混淆的语法及函数。<br />
<span id="more-347"></span></p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" bgcolor="#dddddd">
<tbody>
<tr bgcolor="#eeeeee">
<th width="60">项目</th>
<th>PHP</th>
<th>Javascript</th>
</tr>
</tbody>
<tbody>
<tr>
<td bgcolor="#ffffff">简介</td>
<td valign="top" bgcolor="#ffffff">PHP 是一种创建动态交互性站点的强有力的<strong>服务器端脚本语言</strong>，常常搭配 Apache (web 服务器) 一起使用。PHP 语法非常类似于 Perl 和 C。</td>
<td valign="top" bgcolor="#ffffff">JavaScript 是因特网上最流行的<strong>客户端脚本语言</strong>，并且可在所有主要的浏览器中运行，比方说 Internet Explorer、 Mozilla、Firefox、Netscape、和 Opera。JavaScript 被用来改进设计、验证表单、检测浏览器、创建cookies等</td>
</tr>
<tr>
<td bgcolor="#ffffff">实现方式</td>
<td valign="top" bgcolor="#ffffff">PHP 的脚本块以<strong> &lt;?php 开始，以 ?&gt;</strong> 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。</p>
<p>当然，在支持简写的服务器上，您可以使用 &lt;? 和 ?&gt; 来开始和结束脚本块。</p>
<p>例：</p>
<p>&lt;?php /PHP Document…… ?&gt;</td>
<td valign="top" bgcolor="#ffffff">HTML 的 &lt;script&gt; 标签用于把 JavaScript 插入 HTML 页面当中。</p>
<p>例：</p>
<p>&lt;script language=&#8221;javascript&#8221;&gt;// JavaScript Document …… &lt;/script&gt;</td>
</tr>
<tr>
<td bgcolor="#ffffff">注释</td>
<td valign="top" bgcolor="#ffffff">单行的注释以 // 开始</p>
<p>多行注释以 /* 开头，以 */ 结尾。</td>
<td valign="top" bgcolor="#ffffff">与PHP相同</td>
</tr>
<tr>
<td bgcolor="#ffffff">变量</td>
<td valign="top" bgcolor="#ffffff"><strong>局部变量申明用var</strong></p>
<p>例：</p>
<p>var sqlstr;</p>
<p><strong>若不使用var，则此变量申明为全局变量。</strong></p>
<p>例：</p>
<p>color=&#8221;#111&#8243;;</td>
<td valign="top" bgcolor="#ffffff"><strong>PHP 中的所有变量都是以 $ 符号开始的。</strong></p>
<p>PHP 是一门松散类型的语言（Loosely Typed Language）,</p>
<p>在 PHP 中，不需要在设置变量之前声明该变量。</p>
<p>根据变量被设置的方式，PHP 会自动地把变量转换为正确的数据类型。</p>
<p>例：</p>
<p>&lt;?php $txt = &#8220;Hello World!&#8221;; $number = 16; ?&gt;</td>
</tr>
<tr>
<td bgcolor="#ffffff">语句</td>
<td valign="top" bgcolor="#ffffff">document.write(&#8220;Hello world&#8221;);</td>
<td valign="top" bgcolor="#ffffff">&lt;?php echo &#8220;Hello World&#8221;; ?&gt;</td>
</tr>
<tr>
<td bgcolor="#ffffff">数组定义</td>
<td valign="top" bgcolor="#ffffff">有三种数组类型：</p>
<ol>
<li><strong>数值数组</strong>
<p>带有数字 ID 键的数组</p>
<p>$names = array(&#8220;Peter&#8221;,&#8221;Quagmire&#8221;,&#8221;Joe&#8221;);</li>
<li><strong>关联数组
<p></strong>数组中的每个 ID 键关联一个值</p>
<p>$ages = array( &#8220;Peter&#8221;=&gt;32, &#8220;Quagmire&#8221;=&gt;30, &#8220;Joe&#8221;=&gt;34);</li>
<li><strong>多维数组
<p></strong>包含一个或多个数组的数组</p>
<p>在多维数组中，主数组中的每个元素也是一个数组。在子数组中的每个元素也可以是数组，以此类推。</li>
</ol>
</td>
<td valign="top" bgcolor="#ffffff"><strong>创建 Array 对象的语法：</strong></p>
<ol>
<li>new Array();</li>
<li>new Array(<em>size</em>);</li>
<li>new Array(<em>element0</em>, <em>element0</em>, &#8230;, <em>elementn</em>);</li>
</ol>
</td>
</tr>
<tr>
<td bgcolor="#ffffff">数组元素数量</td>
<td valign="top" bgcolor="#ffffff"><strong>count() 函数计算数组中的单元数目或对象中的属性个数。</strong></p>
<p>对于数组，返回其元素的个数，对于其他值，返回 1。如果参数是变量而变量没有定义，则返回 0。如果 mode 被设置为 COUNT_RECURSIVE（或 1），则会递归底计算多维数组中的数组的元素个数。</p>
<p>语法：<br />
count(array,mode)</p>
<p> </td>
<td valign="top" bgcolor="#ffffff"><strong>length 属性可设置或返回数组中元素的数目。</strong></p>
<p>数组的 length 属性总是比数组中定义的最后一个元素的下标大 1。对于那些具有连续元素，而且以元素 0 开始的常规数组而言，属性 length 声明了数组中的元素的个数。</p>
<p>语法：arrayObject.length</td>
</tr>
<tr>
<td bgcolor="#ffffff">字符串分割</td>
<td valign="top" bgcolor="#ffffff"><strong>split &#8211; 用正则表达式将字符串分割到数组中 </strong></p>
<p>说明：</p>
<p>array split ( string pattern, string string [, int limit])</td>
<td valign="top" bgcolor="#ffffff"><strong>split() 方法用于把一个字符串分割成字符串数组。</strong></p>
<p>语法：</p>
<p>stringObject.split(separator,howmany)</td>
</tr>
<tr>
<td bgcolor="#ffffff">返回部分字符串</td>
<td valign="top" bgcolor="#ffffff"><strong>substr() 函数返回字符串的一部分。</strong></p>
<p>语法：</p>
<p>substr(string,start,length)</td>
<td valign="top" bgcolor="#ffffff"><strong>substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。</strong></p>
<p>语法： stringObject.substr(start,length)</td>
</tr>
<tr>
<td bgcolor="#ffffff">数学函数</td>
<td valign="top" bgcolor="#ffffff"><strong>floor() 函数向下舍入为最接近的整数。</strong></p>
<p>语法： floor(x)</p>
<p>返回不大于 <em>x</em> 的下一个整数，将 <em>x</em> 的小数部分舍去取整。floor() 返回的类型仍然是 float，因为 float 值的范围通常比 integer 要大。</p>
<p>实例：</p>
<p>&lt;?php echo(floor(5.1)); ?&gt;</td>
<td valign="top" bgcolor="#ffffff"><strong>floor() 方法可对一个数进行下舍入。</strong></p>
<p>语法： Math.floor(x)</p>
<p>floor() 方法执行的是向下取整计算，它返回的是小于或等于函数参数，并且与之最接近的整数。</p>
<p>实例：</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt; document.write(Math.floor(5.1) + &#8220;&lt;br /&gt;&#8221;) &lt;/script&gt;</td>
</tr>
<tr>
<td bgcolor="#ffffff">数学函数</td>
<td valign="top" bgcolor="#ffffff"><strong>round() 函数对浮点数进行四舍五入。</strong></p>
<p>语法：</p>
<p>round(x,prec)</p>
<p>返回将 <em>x</em> 根据指定精度 <em>prec</em> （十进制小数点后数字的数目）进行四舍五入的结果。prec 也可以是负数或零（默认值）。</p>
<p>实例：</p>
<p>&lt;?phpecho(round(0.49)); ?&gt;</td>
<td valign="top" bgcolor="#ffffff"><strong>round() 方法可把一个数字舍入为最接近的整数。</strong></p>
<p>语法：</p>
<p>Math.round(x)</p>
<p>与 x 最接近的整数。</p>
<p>实例：</p>
<p>&lt;script type=&#8221;text/javascript&#8221;&gt;</p>
<p>document.write(Math.round(0.49) + &#8220;&lt;br /&gt;&#8221;) &lt;/script&gt;</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.renniaofei.com/code/php-vs-javascript-yihun-yufa-hanshu-zhengli-duibi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.435 seconds -->
