<?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>【黑客迷】网络安全联盟</title>
	<atom:link href="http://www.hackerfans.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hackerfans.com</link>
	<description>国内专业网络安全联盟,为黑客迷们提供免费的黑客技术学习平台</description>
	<lastBuildDate>Tue, 24 Jan 2012 09:39:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>discuzx专题目录化伪静态设置方法</title>
		<link>http://www.hackerfans.com/hacker-skills/div-css/discuzx-special-muluhua.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/div-css/discuzx-special-muluhua.html#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:39:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前台技术]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=707</guid>
		<description><![CDATA[黑客迷之前发布的SEO优化：仿地宝网URL伪静态版块目录化和贴子目录化 ，受到广大网友的关注和支持。现在有网友问我们的专题是如何实现目录化的，今天特在此向大家公布方法： 新手知识：如何为 Discuz! X2 配置伪静态 步骤一: 进入网站后台-全局-SEO设置-URL静态化 在“门户专题页”格式里填写： special/{name}/ 步骤二: 根据不同的主机选择相应的方法 Apache Web Server(独立主机用户) ----------------------------------------------------------------- 打开.htaccess文件 加上： RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^(.*)/special/(.+)/$ $1/portal.php?mod=topic&#38;topic=$2&#38;%1 ----------------------------------------------------------------- Apache Web Server(虚拟主机用户) ----------------------------------------------------------------- 打开.htaccess文件 加上： RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^special/(.+)/$ portal.php?mod=topic&#38;topic=$1&#38;%1 [L,NC] ----------------------------------------------------------------- IIS Web Server(独立主机用户) ----------------------------------------------------------------- 打开Rewrite.dll文件 加上： RewriteRule ^(.*)/special/(.+)/(\?(.*))*$ $1/portal\.php\?mod=topic&#38;topic=$2&#38;$4 ---------------------------------------------------------------- Nginx Web Server ----------------------------------------------------------------- rewrite ^([^\.]*)/special/(.+)/$ [...]]]></description>
			<content:encoded><![CDATA[<pre> 黑客迷之前发布的SEO优化：仿地宝网URL伪静态版块目录化和贴子目录化 ，受到广大网友的关注和支持。现在有网友问我们的专题是如何实现目录化的，今天特在此向大家公布方法：

新手知识：如何为 Discuz! X2 配置伪静态 

步骤一:
进入网站后台-全局-SEO设置-URL静态化
在“门户专题页”格式里填写：
special/{name}/

步骤二:
根据不同的主机选择相应的方法
Apache Web Server(独立主机用户)
-----------------------------------------------------------------
打开.htaccess文件
加上：
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*)/special/(.+)/$ $1/portal.php?mod=topic&amp;topic=$2&amp;%1
-----------------------------------------------------------------

Apache Web Server(虚拟主机用户)
-----------------------------------------------------------------
打开.htaccess文件
加上：
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^special/(.+)/$ portal.php?mod=topic&amp;topic=$1&amp;%1 [L,NC]
-----------------------------------------------------------------

IIS Web Server(独立主机用户)
-----------------------------------------------------------------
打开Rewrite.dll文件
加上：
RewriteRule ^(.*)/special/(.+)/(\?(.*))*$ $1/portal\.php\?mod=topic&amp;topic=$2&amp;$4 ----------------------------------------------------------------

Nginx Web Server
-----------------------------------------------------------------
rewrite ^([^\.]*)/special/(.+)/$ $1/portal.php?mod=topic&amp;topic=$2 last;
----------------------------------------------------------------

演示地址：http://www.hackerfans.com/special/discuzx/</pre>
<pre></pre>
<pre>原文地址：http://www.moke8.com/article-2123-1.html</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/div-css/discuzx-special-muluhua.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO优化：仿地宝网URL伪静态版块目录化和贴子目录化</title>
		<link>http://www.hackerfans.com/hacker-skills/div-css/seo-tiboon-rewrite-rule.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/div-css/seo-tiboon-rewrite-rule.html#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:38:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前台技术]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=705</guid>
		<description><![CDATA[在《百度搜索引擎优化指南》2.1.2 网站结构里提到，合理的网站结构应该是一个扁平的树型网状结构。而且大家都应该知道权重方面：二级域名&#62;目录&#62;静态页&#62;动态页 那么什么是扁平的树型网状结构呢？ 例如：首页：http://www.hackerfans.com 栏目页：http://www.hackerfans.com/discuzx/ 内容页：http://www.hackerfans.com/discuzx/m826/ 像这样的页面就是一个“扁平的树型网状结构”。每增加一个内容页，都会给栏目页增加一定的权重。像地宝网的URL就是很规范的，整站URL目录化，目录层次不超过2个。对于SEO是很有利的。 那么现在discuz官方的地址是怎么样的呢？ 首页：http://www.discuz.net/forum.php 栏目页：http://www.discuz.net/forum-21-1.html 内容页http://www.discuz.net/thread-2281986-1-1.html 这样的URL是分散的，并不是网状结构，不利于权重的传递。 在这里魔客吧给大家提供一个方法，通过伪静态方法来实现discuzx的地址目录化（目前只支持Apache服务器）。 首先 打开source\function下的function_core.php 找到 if($type == 'forum_forumdisplay') { list(,,, $fid, $page, $extra) = func_get_args(); $r = array( '{fid}' =&#62; empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid], '{page}' =&#62; $page ? $page : 1, ); } elseif($type == 'forum_viewthread') { list(,,, $tid, $page, $prevpage, $extra) = [...]]]></description>
			<content:encoded><![CDATA[<pre>在《百度搜索引擎优化指南》2.1.2 网站结构里提到，合理的网站结构应该是一个扁平的树型网状结构。而且大家都应该知道权重方面：二级域名&gt;目录&gt;静态页&gt;动态页

那么什么是扁平的树型网状结构呢？
例如：首页：http://www.hackerfans.com
      栏目页：http://www.hackerfans.com/discuzx/
      内容页：http://www.hackerfans.com/discuzx/m826/
像这样的页面就是一个“扁平的树型网状结构”。每增加一个内容页，都会给栏目页增加一定的权重。像地宝网的URL就是很规范的，整站URL目录化，目录层次不超过2个。对于SEO是很有利的。

那么现在discuz官方的地址是怎么样的呢？
首页：http://www.discuz.net/forum.php
栏目页：http://www.discuz.net/forum-21-1.html
内容页http://www.discuz.net/thread-2281986-1-1.html
这样的URL是分散的，并不是网状结构，不利于权重的传递。

在这里魔客吧给大家提供一个方法，通过伪静态方法来实现discuzx的地址目录化（目前只支持Apache服务器）。

首先
打开source\function下的function_core.php
找到

    if($type == 'forum_forumdisplay') {
        list(,,, $fid, $page, $extra) = func_get_args();
        $r = array(
            '{fid}' =&gt; empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
            '{page}' =&gt; $page ? $page : 1,
        );
    } elseif($type == 'forum_viewthread') {
        list(,,, $tid, $page, $prevpage, $extra) = func_get_args();
        $r = array(
            '{tid}' =&gt; $tid,
            '{page}' =&gt; $page ? $page : 1,
            '{prevpage}' =&gt; $prevpage &amp;&amp; !IS_ROBOT ? $prevpage : 1,
        );

改为

if($type == 'forum_forumdisplay') {
        list(,,, $fid, $page, $extra) = func_get_args();
        $r = array(
            '{fid}' =&gt; empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
            '{page}' =&gt; $page ,
        );
    } elseif($type == 'forum_viewthread') {
        list(,,, $tid, $page, $prevpage, $extra) = func_get_args();
        $fid = DB::result_first("SELECT fid FROM ".DB::table('forum_thread')." WHERE tid = '$tid'");
        $r = array(
            '{fid}' =&gt; empty($_G['setting']['forumkeys'][$fid]) ? $fid : $_G['setting']['forumkeys'][$fid],
            '{tid}' =&gt; $tid,
            '{page}' =&gt; $page ,
            '{prevpage}' =&gt; $prevpage &amp;&amp; !IS_ROBOT ? $prevpage : 1,
        );

然后进入网站后吧-&gt;''seo设置"-&gt;"url静态化"
在"论坛主题列表页"的格式中填写：{fid}/{page}
在"论坛主题内容页"的格式中填写：{fid}/m{tid}/{page}

rewrite规则如下：</pre>
<pre># 将 RewriteEngine 模式打开
RewriteEngine On

# 修改以下语句中的 /discuz 为你的论坛目录地址，如果程序放在根目录中，请将 /discuz 修改为 /
RewriteBase /

RewriteCond %{REQUEST_URI} !image/admincp/getcolor.htm$
RewriteRule ^(.*)\.htm$  - [F,L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule .*/(.+).php$ $1.php?%1 [L,NC]

# Rewrite 系统规则请勿修改
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule topic-(.+)\.html$ portal.php?mod=topic&amp;topic=$1&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule article-([0-9]+)-([0-9]+)\.html$ portal.php?mod=view&amp;aid=$1&amp;page=$2&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule forum-([0-9a-z_]+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&amp;fid=$1&amp;page=$2&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule thread-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&amp;tid=$1&amp;extra=page\%3D$3&amp;page=$2&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule group-([0-9]+)-([0-9]+)\.html$ forum.php?mod=group&amp;fid=$1&amp;page=$2&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule space-(username|uid)-(.+)\.html$ home.php?mod=space&amp;$1=$2&amp;%1 [L,NC]

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([a-z]+)-(.+)\.html$ $1.php?rewrite=$2&amp;%1 [L,NC] 

## 目录化规则，保留前面的部分可以不影响已经被搜索引擎收录的页面  

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule m([0-9]+)(/([0-9]+))?(/)?$ forum.php?mod=viewthread&amp;tid=$1&amp;extra=page\%3D$5&amp;page=$3&amp;%1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([0-9a-z_]+)(/([0-9]+))?(/)?$ forum.php?mod=forumdisplay&amp;fid=$1&amp;page=$3&amp;%1 [L,NC]
</pre>
<pre>

然后工具，更新缓存，即实现了版块目录化，贴子目录化
在"论坛"-"版块管理"中的"绑定别名"即是版块目录名：
如： discuzx模板版块"绑定别名"为"discuzx"，那么访问地址就是：http://www.hackerfans.com/discuzx/</pre>
<pre>原文地址：http://www.moke8.com/article-1597-1.html</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/div-css/seo-tiboon-rewrite-rule.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpwind8.x仿地宝网高级伪静态详细说明</title>
		<link>http://www.hackerfans.com/hacker-skills/div-css/phpwind-rewrite-rule.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/div-css/phpwind-rewrite-rule.html#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:34:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前台技术]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=702</guid>
		<description><![CDATA[原文链接：http://www.phpwind.net/read-htm-tid-1606032.html 看到很多童鞋都在说伪静态404的问题 我用了下骨头的也404 呵呵 我去年做过论坛就美做过了 于是翻了翻7.32的论坛程序  找了下以前的伪静态 然后自己对比 骨头的 修改了下 成功了 现在 把各种伪带后纳的不带的以及静态命名详细分享给大家！ 适用于8.5   8.7  都可以的 两种地址 自己看吧 很简单的！ 这里就拿服务器IIS来做说明吧 如果是虚拟主机的话 只要主机支持 就去除第一个安装步骤！(下面会说) 首先下载组件：http://www.isapirewrite.com/download/isapi_rwl_x86_0059.msi 1.下载后安装  安装 步骤都默认 一直点中间那个按钮即可！(默认安装到：C:\Program Files\Helicon\ISAPI_Rewrite\) 2.打开IIS 展开网站  右键单击你的网站 选择【 属性】(弹出网站属性窗口) 再点【ISAPI帅选器】点【添加】（帅选器名称：随便写 可执行文件：就是第一步你安装的那个组件的目录里面的ISAPI_Rewrite.dll 文件) 搞定点【 确认】 注：以上两步是用于服务器IIS的 如果是虚拟主机请忽视这两步 下面开始设置伪静态（我就直接按照安装目录的路径说哈） 首先打开：C:\Program Files\Helicon\ISAPI_Rewrite\httpd.ini  (复制以下内容进去 提示文件不存在请右键单击httpd.ini 文件把只读的勾去掉) ------------下面一行开始复制---------- [ISAPI_Rewrite] # Defend your computer from some worm attacks RewriteRule .*(?:global.asa&#124;default\.ida&#124;root\.exe&#124;\.\.).* . [...]]]></description>
			<content:encoded><![CDATA[<p>原文链接：http://www.phpwind.net/read-htm-tid-1606032.html</p>
<p>看到很多童鞋都在说伪静态404的问题 我用了下骨头的也404 呵呵</p>
<p>我去年做过论坛就美做过了 于是翻了翻7.32的论坛程序  找了下以前的伪静态</p>
<p>然后自己对比 骨头的 修改了下 成功了 现在 把各种伪带后纳的不带的以及静态命名详细分享给大家！</p>
<p><strong>适用于8.5   8.7  都可以的</strong></p>
<p><strong>两种地址 自己看吧 很简单的！</strong></p>
<p><strong>这里就拿服务器IIS来做说明吧 如果是虚拟主机的话 只要主机支持 就去除第一个安装步骤！(下面会说)</strong></p>
<p><strong>首先下载组件：</strong><a id="url_3" href="http://www.isapirewrite.com/download/isapi_rwl_x86_0059.msi" target="_blank">http://www.isapirewrite.com/download/isapi_rwl_x86_0059.msi</a></p>
<p>1.下载后安装  安装 步骤都默认 一直点中间那个按钮即可！(默认安装到：C:\Program Files\Helicon\ISAPI_Rewrite\)<br />
2.打开IIS 展开网站  右键单击你的网站 选择【 属性】(弹出网站属性窗口) 再点【ISAPI帅选器】点【添加】（帅选器名称：随便写 可执行文件：就是第一步你安装的那个组件的目录里面的ISAPI_Rewrite.dll 文件) 搞定点【 确认】<br />
<strong>注：以上两步是用于服务器IIS的 如果是虚拟主机请忽视这两步</strong></p>
<p><strong>下面开始设置伪静态（我就直接按照安装目录的路径说哈）</strong></p>
<p><strong>首先打开：C:\Program Files\Helicon\ISAPI_Rewrite\httpd.ini  (复制以下内容进去 提示文件不存在请右键单击</strong><strong>httpd.ini 文件把只读的勾去掉</strong><strong>)</strong><br />
<strong>------------下面一行开始复制----------</strong><br />
[ISAPI_Rewrite]<br />
# Defend your computer from some worm attacks<br />
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]<br />
&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteRule ^(.*)/thread-htm-tid-(\d+)-(.*).html  $1/thread.php?fid=$2<br />
RewriteRule ^(.*)/read-htm-tid-(\d+)-(.*).html  $1/read.php?tid=$2<br />
RewriteRule ^(.*)/<strong>wg</strong>(\d+)-(.*)$ $1/thread.php?fid=$2&amp;page=$3<br />
RewriteRule ^(.*)/<strong>wg</strong>(.*)$      $1/thread.php?fid=$2&amp;page=$3<br />
RewriteRule ^(.*)/<strong>n</strong>(\d+)-(\d+)-(.*)$  $1/read.php?tid=$2&amp;page=$3&amp;fpage=$4<br />
RewriteRule ^(.*)/<strong>n</strong>(\d+)-(.*)$       $1/read.php?tid=$2&amp;page=$3<br />
RewriteRule ^(.*)/<strong>n</strong>(.*)$         $1/read.php?tid=$2</p>
<p>RewriteRule ^(.*)-htm-(.*)$ $1.php?$2<br />
RewriteRule ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2<br />
&lt;/IfModule&gt;<br />
<strong>------------复制到上面一行结束----------</strong><br />
<strong><br />
</strong><br />
注视：以上代码中的：wg 代表<strong><strong>自定义</strong></strong><strong>版块名称 如：<a id="url_4" href="http://bbs.wgcn.cn/wg8" target="_blank">http://bbs.wgcn.cn/wg8</a>  (8=版块ID wg就是自己定义的名称）</strong><br />
<strong><strong>注视：以上代码中的：0代表自定义帖子名称 如：</strong><strong>http://bbs.wgcn.cn/n1 （n=你自己定义的名称 1=帖子ID）</strong></strong></p>
<p><strong>提示：虚拟主机请把蓝色部分文字复制 保存为：<strong>.htaccess 文件 传到根目录</strong></strong><br />
<strong></strong><br />
<strong>然后打开论坛目录：require/common.php</strong><br />
<strong>把</strong><br />
<strong><strong>------------下面一行开始----------</strong></strong><br />
function urlRewrite($url) {<br />
global $db_htmifopen, $db_dir, $db_ext;<br />
if (!$db_htmifopen) return $url;<br />
$tmppos = strpos($url, '#');<br />
$add = $tmppos !== false ? substr($url, $tmppos) : '';<br />
$turl = str_replace(array('.php?', '=', '&amp;', '&amp;', $add), array($db_dir, '-', '-', '-', ''), $url);<br />
$turl != $url &amp;&amp; $turl .= $db_ext;<br />
return $turl . $add;<br />
}<br />
<strong>------------结束----------</strong><br />
替换为：<br />
<strong>------------下面一行开始复制----------</strong><br />
function urlRewrite($url) {<br />
global $db_htmifopen, $db_dir, $db_ext;<br />
if (!$db_htmifopen) return $url;<br />
if (!preg_match('/^(http|ftp|telnet|mms|rtsp)|admin.php|rss.php/i', $url)){<br />
$add = strpos($url, '#') !== false ? substr($url, strpos($url, '#')) : '';<br />
if(strpos($url, 'thread.php?') !== false){<br />
unset($rw);<br />
$tharr = explode('&amp;', substr(str_replace($add, '', $url), 11));<br />
foreach($tharr as $key =&gt; $value){<br />
$ru = explode('=', $value, 3);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'fid':<br />
$rw['fid'] = $ru['1'];<br />
$rw['para'] &lt; 1 &amp;&amp; $rw['para'] = 1;<br />
break;<br />
case 'page':<br />
$rw['page'] = $ru['1'];<br />
$rw['para'] &lt; 2 &amp;&amp; $rw['para'] = 2;<br />
break;<br />
case 'type':<br />
$rw['type'] = $ru['1'];<br />
$rw['para'] &lt; 4 &amp;&amp; $rw['para'] = 4;<br />
break;<br />
default:<br />
$rw['para'] = 8;<br />
$urlfail = 1;<br />
break;<br />
}<br />
}<br />
}<br />
switch($rw['para']){<br />
case '1':<br />
$url = "<strong>wg</strong>" . $rw['fid'] ;<br />
break;<br />
case '2':<br />
$url = "<strong>wg</strong>" . $rw['fid'] . "-" . $rw['page'] ;<br />
break;<br />
case '4':<br />
$url = "<strong>wg</strong>" . $rw['fid'] . "-" . $rw['page'] . "-" . $rw['type'] ;<br />
break;<br />
}<br />
}elseif(strpos($url, 'read.php?') !== false){<br />
unset($rw);<br />
$rarr = explode('&amp;', substr(str_replace($add, '', $url), 9));<br />
foreach($rarr as $key =&gt; $value){<br />
$ru = explode('=', $value, 2);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'tid':<br />
$rw['tid'] = $ru['1'];<br />
$rw['type'] &lt; 1 &amp;&amp; $rw['type'] = 1;<br />
break;<br />
case 'page':<br />
$rw['page'] = $ru['1'];<br />
$rw['type'] &lt; 2 &amp;&amp; $rw['type'] = 2;<br />
break;<br />
case 'fpage':<br />
$rw['fpage'] = $ru['1'];<br />
$rw['type'] &lt; 3 &amp;&amp; $rw['type'] = 3;<br />
break;<br />
default:<br />
$rw['type'] = 4;<br />
$urlfail = 1;<br />
break;<br />
}<br />
}<br />
}<br />
switch($rw['type']){<br />
case '1':<br />
$url = "<strong>n</strong>" . $rw['tid'];<br />
break;<br />
case '2':<br />
$url = "<strong>n</strong>" .  $rw['tid'] . "-" . $rw['page'];<br />
break;<br />
case '3':<br />
$url = "<strong>n</strong>" .  $rw['tid'] . "-" . $rw['page'] . "-" . $rw['fpage'];<br />
break;<br />
}<br />
}<br />
if($urlfail){<br />
$url = str_replace(<br />
array('.php?', '=', '&amp;', $add),<br />
array($db_dir, '-', '-', ''),<br />
$url<br />
) . $db_ext . $add;<br />
}<br />
}elseif(strpos($url, 'hack.php?') !== false){<br />
unset($rw);<br />
$rarr = explode('&amp;', substr(str_replace($add, '', $url), 9));<br />
foreach($rarr as $key =&gt; $value){<br />
$ru = explode('=', $value, 2);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'H_name':<br />
$rw['H_name_value'] = $ru['1'];<br />
if(in_array($rw['H_name_value'],array('fenlei','mm'))){<br />
$rw['type'] = 1;<br />
}<br />
break;<br />
}<br />
}<br />
switch($rw['type']){<br />
case '1':<br />
$url = $rw['H_name_value'] . "/";<br />
break;<br />
//case '2':<br />
// $url = $rw['tid'] . "_" . $rw['page'] . ".html";<br />
// break;<br />
//case '3':<br />
// $url = $rw['tid'] . "_" . $rw['page'] . "_" . $rw['fpage'] . ".html";<br />
// break;<br />
}<br />
}<br />
}<br />
return "$url";<br />
}<br />
<strong>------------上面一行结束----------</strong><br />
注释：自己看代码中的红色表示的字符 需要跟你开始静态哪里设置的对应哦 （这个不多说你们懂得）</p>
<p><strong>网站后台的伪静态（开启）</strong><br />
<strong><span style="font-size: x-small;"><span style="font-family: Simsun;">静态目录：-htm-</span></span></strong><br />
<span style="font-size: x-small;"><span style="font-family: Simsun;">静态目录扩展名设置：.html</span></span><br />
<span style="font-size: x-small;"><span style="font-family: Simsun;"><br />
</span></span><br />
<span style="font-family: Simsun;"><span style="font-size: x-small;">(其实这里只要开启就OK了名称好像默认的都OK)</span></span><br />
<span style="font-family: Simsun;"><span style="font-size: x-small;"><br />
</span></span><br />
<span style="font-family: Simsun;"><span style="font-size: x-small;">好的 下面你访问你的网站版块地址=</span></span><a id="url_5" href="http://bbs.wgcn.cn/wg8" target="_blank">http://bbs.wgcn.cn/wg8</a>  帖子地址=<a id="url_1" href="http://bbs.wgcn.cn/08" target="_blank">http://bbs.wgcn.cn/08</a><br />
---------------------------------------------------------------------------------------------------------------<br />
下面这里说的是把帖子地址改为：<a id="url_2" href="http://bbs.wgcn.cn/08.html" target="_blank">http://bbs.wgcn.cn/n8.html</a> 样式<br />
复制以下代码到：<strong>httpd.ini  </strong><br />
<strong>------------下面一行开始复制----------</strong><br />
[ISAPI_Rewrite]<br />
# Defend your computer from some worm attacks<br />
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]<br />
&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteRule ^(.*)/thread-htm-tid-(\d+)-(.*).html $1/thread.php?fid=$2<br />
RewriteRule ^(.*)/read-htm-tid-(\d+)-(.*).html $1/read.php?tid=$2<br />
RewriteRule ^(.*)/wg(\d+)-(.*)$ $1/thread.php?fid=$2&amp;page=$3<br />
RewriteRule ^(.*)/wg(.*)$ $1/thread.php?fid=$2&amp;page=$3<br />
RewriteRule ^(.*)/n(\d+)-(\d+)-(.*).html$ $1/read.php?tid=$2&amp;page=$3&amp;fpage=$4<br />
RewriteRule ^(.*)/n(\d+)-(.*).html$ $1/read.php?tid=$2&amp;page=$3<br />
RewriteRule ^(.*)/n(.*).html$ $1/read.php?tid=$2<br />
RewriteRule ^(.*)-htm-(.*)$ $1.php?$2<br />
RewriteRule ^(.*)/simple/([a-z0-9\_]+\.html)$ $1/simple/index.php?$2<br />
&lt;/IfModule&gt;<br />
<strong>------------上面一行结束----------</strong><br />
<strong><br />
</strong><br />
注释：红色的就是不同的地方了大家懂的<br />
<strong>提示：虚拟主机请把蓝色部分文字复制 保存为：<strong>.htaccess 文件 传到根目录</strong></strong></p>
<p><strong>require/common.php （还是替换哪一段 看上面有说是替换哪一段）</strong><br />
<strong><strong>------------下面一行开始复制----------</strong></strong><br />
function urlRewrite($url) {<br />
global $db_htmifopen, $db_dir, $db_ext;<br />
if (!$db_htmifopen) return $url;<br />
if (!preg_match('/^(http|ftp|telnet|mms|rtsp)|admin.php|rss.php/i', $url)){<br />
$add = strpos($url, '#') !== false ? substr($url, strpos($url, '#')) : '';<br />
if(strpos($url, 'thread.php?') !== false){<br />
unset($rw);<br />
$tharr = explode('&amp;', substr(str_replace($add, '', $url), 11));<br />
foreach($tharr as $key =&gt; $value){<br />
$ru = explode('=', $value, 3);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'fid':<br />
$rw['fid'] = $ru['1'];<br />
$rw['para'] &lt; 1 &amp;&amp; $rw['para'] = 1;<br />
break;<br />
case 'page':<br />
$rw['page'] = $ru['1'];<br />
$rw['para'] &lt; 2 &amp;&amp; $rw['para'] = 2;<br />
break;<br />
case 'type':<br />
$rw['type'] = $ru['1'];<br />
$rw['para'] &lt; 4 &amp;&amp; $rw['para'] = 4;<br />
break;<br />
default:<br />
$rw['para'] = 8;<br />
$urlfail = 1;<br />
break;<br />
}<br />
}<br />
}<br />
switch($rw['para']){<br />
case '1':<br />
$url = "wg" . $rw['fid'] ;<br />
break;<br />
case '2':<br />
$url = "wg" . $rw['fid'] . "_" . $rw['page'] ;<br />
break;<br />
case '4':<br />
$url = "wg" . $rw['fid'] . "_" . $rw['page'] . "_" . $rw['type'] ;<br />
break;<br />
}<br />
}elseif(strpos($url, 'read.php?') !== false){<br />
unset($rw);<br />
$rarr = explode('&amp;', substr(str_replace($add, '', $url), 9));<br />
foreach($rarr as $key =&gt; $value){<br />
$ru = explode('=', $value, 2);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'tid':<br />
$rw['tid'] = $ru['1'];<br />
$rw['type'] &lt; 1 &amp;&amp; $rw['type'] = 1;<br />
break;<br />
case 'page':<br />
$rw['page'] = $ru['1'];<br />
$rw['type'] &lt; 2 &amp;&amp; $rw['type'] = 2;<br />
break;<br />
case 'fpage':<br />
$rw['fpage'] = $ru['1'];<br />
$rw['type'] &lt; 3 &amp;&amp; $rw['type'] = 3;<br />
break;<br />
default:<br />
$rw['type'] = 4;<br />
$urlfail = 1;<br />
break;<br />
}<br />
}<br />
}<br />
switch($rw['type']){<br />
case '1':<br />
$url = "<strong>n</strong>" .$rw['tid'] . ".html";<br />
break;<br />
case '2':<br />
$url = "<strong>n</strong>" .$rw['tid'] . "-" . $rw['page'] . ".html";<br />
break;<br />
case '3':<br />
$url = "<strong>n</strong>" . $rw['tid'] . "-" . $rw['page'] . "-" . $rw['fpage'] . ".html";<br />
break;<br />
}<br />
}<br />
if($urlfail){<br />
$url = str_replace(<br />
array('.php?', '=', '&amp;', $add),<br />
array($db_dir, '-', '-', ''),<br />
$url<br />
) . $db_ext . $add;<br />
}<br />
}elseif(strpos($url, 'hack.php?') !== false){<br />
unset($rw);<br />
$rarr = explode('&amp;', substr(str_replace($add, '', $url), 9));<br />
foreach($rarr as $key =&gt; $value){<br />
$ru = explode('=', $value, 2);<br />
if($ru['1']){<br />
switch($ru['0']){<br />
case 'H_name':<br />
$rw['H_name_value'] = $ru['1'];<br />
if(in_array($rw['H_name_value'],array('fenlei','mm'))){<br />
$rw['type'] = 1;<br />
}<br />
break;<br />
}<br />
}<br />
switch($rw['type']){<br />
case '1':<br />
$url = $rw['H_name_value'] . "/";<br />
break;<br />
//case '2':<br />
// $url = $rw['tid'] . "_" . $rw['page'] . ".html";<br />
// break;<br />
//case '3':<br />
// $url = $rw['tid'] . "_" . $rw['page'] . "_" . $rw['fpage'] . ".html";<br />
// break;<br />
}<br />
}<br />
}<br />
return "$url";<br />
}<br />
<strong>------------上面一行结束----------</strong><br />
我标识了 自己对比吧 OK  现在就可以了</p>
<p>修复问题：<br />
原：$url = $rw['tid'] . "_" . $rw['page'] . "_" . $rw['fpage'] ;</p>
<p>改：$url = $rw['tid'] . "-" . $rw['page'] . "-" . $rw['fpage'] ;</p>
<p>符号错误了哈 <strong><span style="font-size: x-large;">_</span></strong> 改为 <strong><span style="font-size: x-large;">-</span></strong> (因为以前无法访问帖子版块多页现在可以了以上代码修复了第二页地址为：bbs.wgcn.cn/01_2 )</p>
<p>大家勿用0作为自定义名称 否则会造成论坛无法上传头像 且 0开头的文件都无法访问！</p>
<p>&nbsp;</p>
<p>附相关文章：</p>
<p>STWind 高级伪静态教程适用版本PW8.5(0323) http://www.phpwind.net/read.php?tid-1280119.html</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/div-css/phpwind-rewrite-rule.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>实现真正图片延时加载：实现JQuery LazyLoad的真正价值</title>
		<link>http://www.hackerfans.com/hacker-skills/div-css/jquery-lazy-load-optimize.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/div-css/jquery-lazy-load-optimize.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 16:09:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网站前台技术]]></category>
		<category><![CDATA[lazy-load]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=696</guid>
		<description><![CDATA[jQuery lazyLoad.js插件 是一款基于jquery框架，可以“实现”图片延迟加载的插件。请注意，我用了双引号，因为从我自己实际调试的结论来说呢，并不会延迟加载，而是先下载，然后通过改变&#60;img&#62;的src属性来隐藏原来的图片。 我们先来看看他的代码吧！ &#60;script type="text/javascript" src="/static/jssrc/lazyload.js"&#62;&#60;/script&#62; &#60;script type="text/javascript"&#62; $(document).ready(function(){ $("#team_main_side img").lazyload({ placeholder : "/images/loading.gif", effect : "fadeIn" }); }); &#60;/script&#62; 工作原理是先在&#60;img&#62;下创建original属性，并把src属性值赋值给original，然后再把src的值修改成你设置的placeholder的值。当滚动条到达图片位置时，再把original的属性赋值给src。这个时候向服务器发出一个HTTP请求，确认下有没有修改，服务器返回一个304状态，等于本来一遍HTTP请求能完成的工作，它用了2遍，非但没有减少开支，还增加开销，我彻底无语了。(如下图,火狐的firebug显示) 假如你使用过这个插件的话，你有没有发现，无论多大的图片，只要你的滚动条到达那个位置的话，图片就会很快的显示出来，有点不可思议吧。那是因为那张图片已经下载好了。 再者，我自己的想法，jquery的代码是在页面加载完成后才会执行的，那页面加载完的时候，图片较小的都下载完了，再执行jq代码的话，那种意义就不存在了。 那有问题肯定要解决，把这个插件的代码改一改。 好吧，开始了 打开这个jquery.lazyLoad.js,找到如下图第一个红框的代码，直接注释掉；第二个红框是需要自己手工添加上去的，然后保存。 在页面插入图片的代码如&#60;img src="http://hackerfans.com/upload/201010122047211034.jpg" alt=""/&#62;修改成&#60;img original="http://hackerfans.com/upload/201010122047211034.jpg" src="http://hackerfans.com/img/img_loading.gif" alt=""/&#62; 最后记得插入js代码 &#60;script type="text/javascript" src="/js/jquery.js"&#62;&#60;/script&#62;&#60;!--jquery 包--&#62; &#60;script type="text/javascript" src="/js/jquery.lazyload.js"&#62;&#60;/script&#62;&#60;!--lazyload 插件--&#62; &#60;script type="text/javascript"&#62; //初始化代码 $(document).ready(function(){ $("#team_main_side img").lazyload({ placeholder : "http://hackerfans.com/img/img_loading.gif", effect : "fadeIn" }); [...]]]></description>
			<content:encoded><![CDATA[<pre>jQuery lazyLoad.js插件 是一款基于jquery框架，可以“实现”图片延迟加载的插件。请注意，我用了双引号，因为从我自己实际调试的结论来说呢，并不会延迟加载，而是先下载，然后通过改变&lt;img&gt;的src属性来隐藏原来的图片。
我们先来看看他的代码吧！
&lt;script type="text/javascript" src="/static/jssrc/lazyload.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
 $(document).ready(function(){
     $("#team_main_side img").lazyload({
          placeholder : "/images/loading.gif",
          effect : "fadeIn"
     });
 });
&lt;/script&gt;

工作原理是先在&lt;img&gt;下创建original属性，并把src属性值赋值给original，然后再把src的值修改成你设置的placeholder的值。当滚动条到达图片位置时，再把original的属性赋值给src。这个时候向服务器发出一个HTTP请求，确认下有没有修改，服务器返回一个304状态，等于本来一遍HTTP请求能完成的工作，它用了2遍，非但没有减少开支，还增加开销，我彻底无语了。(如下图,火狐的firebug显示)

<a href="http://www.hackerfans.com/wp-content/uploads/2011/12/201010122118058646.jpg"><img class="alignnone size-medium wp-image-697" title="201010122118058646" src="http://www.hackerfans.com/wp-content/uploads/2011/12/201010122118058646-300x138.jpg" alt="" width="300" height="138" /></a>

假如你使用过这个插件的话，你有没有发现，无论多大的图片，只要你的滚动条到达那个位置的话，图片就会很快的显示出来，有点不可思议吧。那是因为那张图片已经下载好了。
再者，我自己的想法，jquery的代码是在页面加载完成后才会执行的，那页面加载完的时候，图片较小的都下载完了，再执行jq代码的话，那种意义就不存在了。

 那有问题肯定要解决，把这个插件的代码改一改。

好吧，开始了

打开这个jquery.lazyLoad.js,找到如下图第一个红框的代码，直接注释掉；第二个红框是需要自己手工添加上去的，然后保存。

<a href="http://www.hackerfans.com/wp-content/uploads/2011/12/201010122233291327.jpg"><img class="alignnone size-medium wp-image-698" title="201010122233291327" src="http://www.hackerfans.com/wp-content/uploads/2011/12/201010122233291327-300x105.jpg" alt="" width="300" height="105" /></a>

在页面插入图片的代码如&lt;img src="http://hackerfans.com/upload/201010122047211034.jpg" alt=""/&gt;修改成&lt;img original="http://hackerfans.com/upload/201010122047211034.jpg" src="http://hackerfans.com/img/img_loading.gif" alt=""/&gt;

最后记得插入js代码

&lt;script type="text/javascript" src="/js/jquery.js"&gt;&lt;/script&gt;&lt;!--jquery 包--&gt;
&lt;script type="text/javascript" src="/js/jquery.lazyload.js"&gt;&lt;/script&gt;&lt;!--lazyload 插件--&gt;
&lt;script type="text/javascript"&gt; //初始化代码
 $(document).ready(function(){
     $("#team_main_side img").lazyload({
          placeholder : "http://hackerfans.com/img/img_loading.gif",
          effect : "fadeIn"
     });
 });
&lt;/script&gt;

这样所有图片就都显示img_loading.gif了,由于都是请求的同一个图片,浏览器只会请求一次..对于减少服务器http请求来说,我们的目标已经达到了.当浏览器滚动到图片的位置时候，就会把图片加载进来。</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/div-css/jquery-lazy-load-optimize.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>来不及翻译：正确的nginx-301-SEO-rewrite跳转代码</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-301-seo-rewrite.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-301-seo-rewrite.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 17:49:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>
		<category><![CDATA[nginx rewrite正确写法]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=689</guid>
		<description><![CDATA[People who during their shared hosting life used to configure everything using only Apache’s .htaccess files, usually translate the following rules: RewriteCond %{HTTP_HOST} nginx.org RewriteRule (.*) http://www.nginx.org$1 to something like this: server { listen 80; server_name www.nginx.org nginx.org; if ($http_host = nginx.org) { rewrite (.*) http://www.nginx.org$1; } ... } This is a wrong, cumbersome, and [...]]]></description>
			<content:encoded><![CDATA[<pre>People who during their shared hosting life used to configure everything using only Apache’s .htaccess files, usually translate the following rules:

RewriteCond  %{HTTP_HOST}  nginx.org
RewriteRule  (.*)          http://www.nginx.org$1
to something like this:

server {
    listen       80;
    server_name  www.nginx.org  nginx.org;
    if ($http_host = nginx.org) {
        rewrite  (.*)  http://www.nginx.org$1;
    }
    ...
}
This is a wrong, cumbersome, and ineffective way. The right way is to define a separate server for nginx.org:

server {
    listen       80;
    server_name  nginx.org;
    return       301 http://www.nginx.org$request_uri;
}

server {
    listen       80;
    server_name  www.nginx.org;
    ...
}
On versions prior to 0.9.1, redirects can be made with:
    rewrite      ^ http://www.nginx.org$request_uri?;
Another example. Instead of the “upside-down” logic “all that is not nginx.com and is not www.nginx.com”:

RewriteCond  %{HTTP_HOST}  !nginx.com
RewriteCond  %{HTTP_HOST}  !www.nginx.com
RewriteRule  (.*)          http://www.nginx.com$1
one should simply define nginx.com, www.nginx.com, and “everything else”:

server {
    listen       80;
    server_name  nginx.com www.nginx.com;
    ...
}

server {
    listen       80 default_server;
    server_name  _;
    return       301 http://nginx.com$request_uri;
}
On versions prior to 0.9.1, redirects can be made with:
    rewrite      ^ http://nginx.com$request_uri?;
Converting Mongrel rules

Typical Mongrel rules:

DocumentRoot /var/www/myapp.com/current/public

RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]

RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]

RewriteRule ^/(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]
should be converted to

location / {
    root       /var/www/myapp.com/current/public;

    try_files  /system/maintenance.html
               $uri  $uri/index.html $uri.html
               @mongrel;
}

location @mongrel {
    proxy_pass  http://mongrel;
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-301-seo-rewrite.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux-commands-often</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/linux%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%e6%80%bb%e7%bb%93.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/linux%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%e6%80%bb%e7%bb%93.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 15:13:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=687</guid>
		<description><![CDATA[系统相关 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 内存/资源相关 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh &#60;目录名&#62; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>系统相关</strong></p>
<pre># uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue   # 查看操作系统版本
# cat /proc/cpuinfo      # 查看CPU信息
# hostname               # 查看计算机名
# lspci -tv              # 列出所有PCI设备
# lsusb -tv              # 列出所有USB设备
# lsmod                  # 列出加载的内核模块
# env                    # 查看环境变量</pre>
<p><strong>内存/资源<strong>相关</strong></strong></p>
<pre># free -m                # 查看内存使用量和交换区使用量
# df -h                  # 查看各分区使用情况
# du -sh &lt;目录名&gt;        # 查看指定目录的大小
# grep MemTotal /proc/meminfo   # 查看内存总量
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                 # 查看系统运行时间、用户数、负载
# cat /proc/loadavg      # 查看系统负载</pre>
<p><strong>磁盘和分区<strong>相关</strong></strong></p>
<pre># mount | column -t      # 查看挂接的分区状态
# fdisk -l               # 查看所有分区
# swapon -s              # 查看所有交换分区
# hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE       # 查看启动时IDE设备检测状况</pre>
<p><strong>网络<strong>相关</strong></strong></p>
<pre># ifconfig               # 查看所有网络接口的属性
# iptables -L            # 查看防火墙设置
# route -n               # 查看路由表
# netstat -lntp          # 查看所有监听端口
# netstat -antp          # 查看所有已经建立的连接
# netstat -s             # 查看网络统计信息</pre>
<p><strong>进程<strong>相关</strong></strong></p>
<pre># ps -ef                 # 查看所有进程
# top                    # 实时显示进程状态</pre>
<p><strong>用户<strong>相关</strong></strong></p>
<pre># w                      # 查看活动用户
# id &lt;用户名&gt;            # 查看指定用户信息
# last                   # 查看用户登录日志
# cut -d: -f1 /etc/passwd   # 查看系统所有用户
# cut -d: -f1 /etc/group    # 查看系统所有组
# crontab -l             # 查看当前用户的计划任务</pre>
<p><strong>服务<strong>相关</strong></strong></p>
<pre># chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on    # 列出所有启动的系统服务</pre>
<p><strong>程序<strong>相关</strong></strong></p>
<pre># rpm -qa                # 查看所有安装的软件包</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/linux%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%e6%80%bb%e7%bb%93.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>解读Linux内存占用-为啥Linux内存占用总是那么高？</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/linux-cpu-too-high.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/linux-cpu-too-high.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 15:05:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=685</guid>
		<description><![CDATA[最近老有人问为何开机后，还没有其他服务，mem就被用完了？是不是内存泄露？是否要重启服务？只能说不要看现象，要看本质才能找到问题的根源。 往往给出这样的结果，怀疑内存用了90%,如下： Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached 这样怀疑很普遍，因为很多人用惯了Windows.Windows下，可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来，Windows物理内存总是留下一定的空间，就算此时物理内存有空闲时，也会让某些程序去使用虚拟内存，目的是在Windows下启动新程序时，直接分配空闲的物理内存，这样子新程序启动速度就较快，而Linux则不然。 而在Linux下，使用top命令看到内存占用情况： Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached 这里的结果显示使用了3.8G的used，占用率达到90%。看看free的结果你还可以对比一下： $ free -m total used free shared buffers cached Mem: 4049 3784 265 0 [...]]]></description>
			<content:encoded><![CDATA[<pre>最近老有人问为何开机后，还没有其他服务，mem就被用完了？是不是内存泄露？是否要重启服务？只能说不要看现象，要看本质才能找到问题的根源。
往往给出这样的结果，怀疑内存用了90%,如下：
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这样怀疑很普遍，因为很多人用惯了Windows.Windows下，可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来，Windows物理内存总是留下一定的空间，就算此时物理内存有空闲时，也会让某些程序去使用虚拟内存，目的是在Windows下启动新程序时，直接分配空闲的物理内存，这样子新程序启动速度就较快，而Linux则不然。

而在Linux下，使用top命令看到内存占用情况：

Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这里的结果显示使用了3.8G的used，占用率达到90%。看看free的结果你还可以对比一下：
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588

虽然MEM显示了3.7G左右的used，但是（-/+ buffers/cache）减去buffers和cache的结果可以看到，当前进程实际占用内存是636M，而可用空闲（free）内存为3.4G。

可以这么理解：在linux的内存分配机制中，优先使用物理内存，当物理内存还有空闲时（还够用），不会释放其占用内存，就算占用内存的程序已经被关闭了，该程序所占用的内存用来做缓存使用，对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子：使用了4G的内存，3.7G被占用，但是buuffer和cached部分作为缓存，可以使用命中率的方式提高使用效率，而且这部分缓存是根据指令随时可以释放的，我们可以认为这部分内存没有实际被使用，也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存，是used-(buffers+cache)，也可以认为如果swap没有大量使用，mem还是够用的，只有mem被当前进程实际占用完（没有了buffers和cache），才会使用到swap的。</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/linux-cpu-too-high.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>手工深度优化debian VPS系统</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/how-to-optimize-debian-vps.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/how-to-optimize-debian-vps.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 08:55:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=683</guid>
		<description><![CDATA[买VPS回来，一般提供商安装的系统都是自带apache神马一大堆乱七八糟玩意，占硬盘占内存不说，一不小心冲突起来挂档神马的。那就是欲哭无泪啦。所以…… 本小菜手工把Debian的标准版和迷你版对比，将所有多余程序卸载！ 如果不想看原理只想一步到位，请跳到文章最后： 注意，以下星号是为了一起卸载有关组件、减少垃圾； 多余的服务类软件（会自己启动，影响较大的）： 以下为引用的内容： apache2-* //apache服务器，我们一般自己重装或者换Nginx等等 bind9-* //dns服务器，我们一般不在自己VPS上搭建DNS服务器，果断卸掉 xinetd //xinetd是服务守护进程，比如平时ftp服务器未开启，发现有人访问21端口则自动启动ftp服务器。VPS不需要 samba-* //samba能让linux系统使用windows的共享功能，VPS显然不需要 nscd-* //DNS缓存软件，同bind9，不需要 portmap //端口转发，一般Web服务器不需要 sendmail-* //发送邮件用，一般程序都使用php-sendmail，不需要这个 sasl2-bin //一个权限程序，不光占用资源，还容易在建立系统账户时候出错，果断删掉 多余的系统组件（不会自启动，但是占用硬盘，也许还会造成冲突什么的）： lynx //文本浏览器，一般人系用不到滴~~ memtester //测试内存有没有坏，我没那么无聊…… unixodbc odbcinst-* //odbc数据库，主要给windows用，做网站一般用不到 python-* //大名鼎鼎的Python语言，如果正常玩linux很可能用到，但是Web服务器是用不到的 sudo //让授权过的普通用户获得root权限，VPS不需要 tcpdump //TCP抓包，你用么？ ttf-* //桌面环境用的字体，我们只要命令行…… 可以更换的系统组件： ksyslog或rsyslog -&#62; inetutils-syslogd //这是系统日志，前两者功能齐全，但是系统占用就多余了（其实都不装也可以） vim-* -&#62; nano //vim编辑器大名鼎鼎，可是我真的不会用，而且虽然资源比emacs小了若干，还是拼不过nano…… bash -&#62; dash或pdksh //bash控制台也有点臃肿了，不过为了方便，不是必要不用换掉。 openssh -&#62; dropbear //这是SSH服务端，如果你喜欢在SSH上开一堆账号给人Fan [...]]]></description>
			<content:encoded><![CDATA[<pre>买VPS回来，一般提供商安装的系统都是自带apache神马一大堆乱七八糟玩意，占硬盘占内存不说，一不小心冲突起来挂档神马的。那就是欲哭无泪啦。所以……

本小菜手工把Debian的标准版和迷你版对比，将所有多余程序卸载！

如果不想看原理只想一步到位，请跳到文章最后：

注意，以下星号是为了一起卸载有关组件、减少垃圾；

多余的服务类软件（会自己启动，影响较大的）：

以下为引用的内容：
apache2-* //apache服务器，我们一般自己重装或者换Nginx等等

bind9-* //dns服务器，我们一般不在自己VPS上搭建DNS服务器，果断卸掉

xinetd //xinetd是服务守护进程，比如平时ftp服务器未开启，发现有人访问21端口则自动启动ftp服务器。VPS不需要

samba-* //samba能让linux系统使用windows的共享功能，VPS显然不需要

nscd-* //DNS缓存软件，同bind9，不需要

portmap //端口转发，一般Web服务器不需要

sendmail-* //发送邮件用，一般程序都使用php-sendmail，不需要这个

sasl2-bin //一个权限程序，不光占用资源，还容易在建立系统账户时候出错，果断删掉

多余的系统组件（不会自启动，但是占用硬盘，也许还会造成冲突什么的）：

lynx //文本浏览器，一般人系用不到滴~~

memtester //测试内存有没有坏，我没那么无聊……

unixodbc odbcinst-* //odbc数据库，主要给windows用，做网站一般用不到

python-* //大名鼎鼎的Python语言，如果正常玩linux很可能用到，但是Web服务器是用不到的

sudo //让授权过的普通用户获得root权限，VPS不需要

tcpdump //TCP抓包，你用么？

ttf-* //桌面环境用的字体，我们只要命令行……

可以更换的系统组件：

ksyslog或rsyslog -&gt; inetutils-syslogd //这是系统日志，前两者功能齐全，但是系统占用就多余了（其实都不装也可以）

vim-* -&gt; nano //vim编辑器大名鼎鼎，可是我真的不会用，而且虽然资源比emacs小了若干，还是拼不过nano……

bash -&gt; dash或pdksh //bash控制台也有点臃肿了，不过为了方便，不是必要不用换掉。

openssh -&gt; dropbear //这是SSH服务端，如果你喜欢在SSH上开一堆账号给人Fan Q的话，还是换了吧，有了Dropbear，每个SSH能省好几M内存呢。

我们把所有操作写成脚本：

先来一下系统升级：

apt-get update&amp;&amp;apt-get upgrade
完全多余的软件

apt-get -y purge apache2-* bind9-* xinetd samba-* nscd-* portmap sendmail-* sasl2-bin
多余的系统组件

apt-get -y purge lynx memtester unixodbc python-* odbcinst-* sudo tcpdump ttf-*
替换的软件，请自行考虑选择并替换。

最后清理一下：
apt-get autoremove &amp;&amp; apt-get clean

贴出优化成果：
root@bvm1:~# ps -A
PID TTY TIME CMD
1 ? 00:00:00 init
1433 ? 00:00:00 syslogd
1457 ? 00:00:00 cron
1463 ? 00:00:00 sshd
1485 ? 00:00:00 sshd
1504 pts/0 00:00:00 bash
3139 pts/0 00:00:00 ps
root@bvm1:~# free -m
total used free shared buffers cached
Mem: 256 10 245 0 0 0
-/+ buffers/cache: 10 245
Swap: 0 0 0</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/how-to-optimize-debian-vps.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP-CGI 进程 CPU 100%解决办法</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/php-cgi-100-cpu.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/php-cgi-100-cpu.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 08:27:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=679</guid>
		<description><![CDATA[有时候，运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器，突然系统负载上升，使用 top 命令查看，很多 php-cgi 进程 CPU 使用率接近100%。后来，我通过跟踪发现，这类情况的出现，跟 PHP 的 file_get_contents() 函数有着密切的关系。 　　大、中型网站中，基于 HTTP 协议的 API 接口调用，是家常便饭。PHP 程序员们喜欢使用简单便捷的 file_get_contents("http://example.com/") 函数，来获取一个 URL 的返回内容，但是，如果 http://example.com/ 这个网站响应缓慢，file_get_contents() 就会一直卡在那儿，不会超时。 　　我们知道，在 php.ini 中，有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间，但是，在 php-cgi(php-fpm) 中，该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数： view plainprint? The timeout (in seconds) for serving a single request after which the [...]]]></description>
			<content:encoded><![CDATA[<pre>有时候，运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器，突然系统负载上升，使用 top 命令查看，很多 php-cgi 进程 CPU 使用率接近100%。后来，我通过跟踪发现，这类情况的出现，跟 PHP 的 file_get_contents() 函数有着密切的关系。

　　大、中型网站中，基于 HTTP 协议的 API 接口调用，是家常便饭。PHP 程序员们喜欢使用简单便捷的 file_get_contents("http://example.com/") 函数，来获取一个 URL 的返回内容，但是，如果 http://example.com/ 这个网站响应缓慢，file_get_contents() 就会一直卡在那儿，不会超时。

　　我们知道，在 php.ini 中，有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间，但是，在 php-cgi(php-fpm) 中，该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数：
view plainprint?
The timeout (in seconds) for serving a single request after which the worker process will be terminated
Should be used when 'max_execution_time' ini option does not stop script execution for some reason
'0s' means 'off'
&lt;value name="request_terminate_timeout"&gt;0s&lt;/value&gt;
　　默认值为 0 秒，也就是说，PHP 脚本会一直执行下去。这样，当所有的 php-cgi 进程都卡在 file_get_contents() 函数时，这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了，Nginx 将给用户返回“502 Bad Gateway”。修改该参数，设置一个 PHP 脚本最大执行时间是必要的，但是，治标不治本。例如改成 &lt;value name="request_terminate_timeout"&gt;30s&lt;/value&gt;，如果发生 file_get_contents() 获取网页内容较慢的情况，这就意味着 150 个 php-cgi 进程，每秒钟只能处理 5 个请求，WebServer 同样很难避免“502 Bad Gateway”。

　　要做到彻底解决，只能让 PHP 程序员们改掉直接使用 file_get_contents("http://example.com/") 的习惯，而是稍微修改一下，加个超时时间，用以下方式来实现 HTTP GET 请求。要是觉得麻烦，可以自行将以下代码封装成一个函数。
view plainprint?
&lt;?php
$ctx = stream_context_create(array(
   'http' =&gt; array(
       'timeout' =&gt; 1 //设置一个超时时间，单位为秒
       )
   )
);
file_get_contents("http://example.com/", 0, $ctx);
?&gt;
　　当然，导致 php-cgi 进程 CPU 100% 的原因不只有这一种，那么，怎么确定是 file_get_contents() 函数导致的呢？

　　首先，使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。

top - 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69
Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.2%sy,  0.0%ni, 89.4%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers
Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi
10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi
10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi
10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi
10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi
10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi
10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi
10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi
10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi
10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi

　　找其中一个 CPU 100% 的 php-cgi 进程的 PID，用以下命令跟踪一下：
strace -p 10747

　　如果屏幕显示：
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)

　　那么，就可以确定是 file_get_contents() 导致的问题了</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/php-cgi-100-cpu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx下防御HTTP GET FLOOD(CC)攻击</title>
		<link>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-anti-ddos-cc.html</link>
		<comments>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-anti-ddos-cc.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 16:00:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[服务器架构]]></category>

		<guid isPermaLink="false">http://www.hackerfans.com/?p=676</guid>
		<description><![CDATA[本文主要介绍了nginx下的HTTP GET FLOOD防御 1、主动防御 为了让Nginx支持更多的并发连接数，根据实际情况对工作线程数和每个工作线程支持的最大连接数进行调整。例如设置"worker_processes 10"和"worker_connections 1024"，那这台服务器支持的最大连接数就是10×1024=10240。 worker_processes 10; events {   use epoll;   worker_connections 10240; } Nginx 0.7开始提供了2个限制用户连接的模块：NginxHttpLimitZoneModule和NginxHttpLimitReqModule。 NginxHttpLimitZoneModule可以根据条件进行并发连接数控制。 例如可以定义以下代码： http {   limit_zone   my_zone  $binary_remote_addr  10m;    server {     location /somedir/ {       limit_conn   my_zone  1;     }   } } 其中"limit_zone  my_zone  $binary_remote_addr  10m"的意思是定义一个名称为my_zone的存储区域、my_zone中的内容为远程IP地址、my_zone的大小为10M；"location /somedir/"的意思是针对somedir目录应用规则；"limit_conn  my_zone  1"的意思是针对上面定义的my_zone 记录区记录的IP地址在指定的目录中只能建立一个连接。 NginxHttpLimitReqModule可以根据条件进行请求频率的控制。 例如可以定义以下代码： [...]]]></description>
			<content:encoded><![CDATA[<p>本文主要介绍了nginx下的HTTP GET FLOOD防御</p>
<p>1、主动防御<br />
为了让Nginx支持更多的并发连接数，根据实际情况对工作线程数和每个工作线程支持的最大连接数进行调整。例如设置"worker_processes 10"和"worker_connections 1024"，那这台服务器支持的最大连接数就是10×1024=10240。<br />
worker_processes 10;<br />
events {<br />
  use epoll;<br />
  worker_connections 10240;<br />
}</p>
<p>Nginx 0.7开始提供了2个限制用户连接的模块：NginxHttpLimitZoneModule和NginxHttpLimitReqModule。<br />
NginxHttpLimitZoneModule可以根据条件进行并发连接数控制。<br />
例如可以定义以下代码：<br />
http {<br />
  limit_zone   my_zone  $binary_remote_addr  10m;<br />
   server {<br />
    location /somedir/ {<br />
      limit_conn   my_zone  1;<br />
    }<br />
  }<br />
}<br />
其中"limit_zone  my_zone  $binary_remote_addr  10m"的意思是定义一个名称为my_zone的存储区域、my_zone中的内容为远程IP地址、my_zone的大小为10M；"location /somedir/"的意思是针对somedir目录应用规则；"limit_conn  my_zone  1"的意思是针对上面定义的my_zone 记录区记录的IP地址在指定的目录中只能建立一个连接。</p>
<p>NginxHttpLimitReqModule可以根据条件进行请求频率的控制。<br />
例如可以定义以下代码：<br />
http {<br />
    limit_req_zone  $binary_remote_addr  zone=my_req_zone:10m   rate=1r/s;<br />
     ...<br />
     server {<br />
         ...<br />
         location /somedir/ {<br />
            limit_req_zone   zone= my_req_zone  burst=2;<br />
        }<br />
其中"limit_req_zone  $binary_remote_addr  zone=my_req_zone:10m  rate=1r/s" 的意思是定义一个名称为my_req_zone的存储区域，my_req_zone内容为远程IP地址，my_req_zone大小为 10M，my_req_zone中的平均请求速率只能为1个每秒；"location /somedir/"的意思是针对somedir目录应用规则；"limit_req_zone   zone= my_req_zone  burst=2"的意思是针对上面定义的my_req_zone记录区记录的IP地址在请求指定的目录中的内容时最高2个每秒的突发请求速率。</p>
<p>当有连接触发上诉规则时，Nginx会报"503 Service Temporarily Unavailable"的错误，停止用户请求。返回一个503，对服务器来说影响不大，只占用一个nginx的线程而已，相对来说还是很划算的。</p>
<p>为了测试效果，我将以上代码放入Nginx的配置文件，并编写了一个php文件显示phpinfo；另外还写了一个html文件，其中嵌入了多个 iframe调用php文件。当我打开这个html文件了，可以看到只有一个iframe中的php文件正常显示了，其他的iframe都显示503错误。                                                                                                                                              <br />
应用举例(Discuz)<br />
Discuz!是使用比较多的一个php论坛程序。以Discuz!7.0为例，程序目录下有比较多的可以直接访问的php文件，但其中最容易受到攻击的一般有index.php(首页)、forumdisplay.php(板块显示)、viewthread.php(帖子显示)。攻击者一般会对这些页面发起大量的请求，导致HTTP服务器连接数耗尽、mysql数据库停止响应，最终导致服务器崩溃。<br />
为了防止上述页面被攻击，我们可以设定以下的规则进行防御：<br />
http {<br />
    limit_zone   myzone_bbs  $binary_remote_addr  10m;<br />
    limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s;<br />
     ...<br />
     server {<br />
         ...<br />
        location ~ ^/bbs/(index|forumdisplay|viewthread).php$ {<br />
            limit_conn   myzone_bbs  3;<br />
            limit_req zone=bbs burst=2 nodelay;<br />
            root           html;<br />
            fastcgi_pass   unix:/dev/shm/php-cgi.sock;<br />
            fastcgi_index  index.php;<br />
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;<br />
            include        fastcgi_params;<br />
                }<br />
          }<br />
}<br />
应用这条规则后，bbs目录下的index.php、forumdisplay.php和viewthread.php这些页面同一个IP只许建立3个连接，并且每秒只能有1个请求(突发请求可以达到2个)。<br />
虽然这样的规则一般来说对正常的用户不会产生影响(极少有人在1秒内打开3个页面)，但是为了防止影响那些手快的用户访问，可以在nginx中自定义503页面，503页面对用户进行提示，然后自动刷新。<br />
在Nginx中自定义503页面：<br />
error_page   503   /errpage/503.html;<br />
503页面的源代码：<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;页面即将载入....&lt;/title&gt;<br />
&lt;meta http-equiv=content-type c&gt;<br />
&lt;META NAME="ROBOTS" C&gt;<br />
&lt;/head&gt;<br />
&lt;body bgcolor="#FFFFFF"&gt;<br />
&lt;table cellpadding="0" cellspacing="0" border="0" width="700" align="center" height="85%"&gt;<br />
  &lt;tr align="center" valign="middle"&gt;<br />
    &lt;td&gt;<br />
    &lt;table cellpadding="10" cellspacing="0" border="0" width="80%" align="center" style="font-family:<br />
Verdana, Tahoma; color: #666666; font-size: 11px"&gt;<br />
    &lt;tr&gt;<br />
      &lt;td valign="middle" align="center" bgcolor="#EBEBEB"&gt;<br />
        &lt;br /&gt;&lt;b style="font-size: 16px"&gt;页面即将载入&lt;/b&gt;<br />
        &lt;br /&gt;&lt;br /&gt;你刷新页面的速度过快。请少安毋躁，页面即将载入...<br />
        &lt;br /&gt;&lt;br /&gt;[&lt;a href="javascript:window.location.reload();"&gt;&lt;font color=#666666&gt;立即重新载入&lt;/font&gt;&lt;/a&gt;]<br />
        &lt;br /&gt;&lt;br /&gt;<br />
      &lt;/td&gt;<br />
    &lt;/tr&gt;<br />
    &lt;/table&gt;<br />
    &lt;/td&gt;<br />
  &lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>&lt;SCRIPT language=javascript&gt;<br />
function update()<br />
{<br />
  window.location.reload();<br />
}<br />
setTimeout("update()",2000);<br />
&lt;/script&gt;</p>
<p>2、被动防御<br />
虽然主动防御已经抵挡了大多数HTTP GET FLOOD攻击，但是道高一尺魔高一丈，攻击者会总会找到你薄弱的环节进行攻击。所以我们在这里也要介绍一下被动防御的一些方法。<br />
1.封IP地址<br />
访问者通过浏览器正常访问网站，与服务器建立的连接一般不会超过20个，我们可以通过脚本禁止连接数过大的IP访问。<br />
以下脚本通过netstat命令列举所有连接，将连接数最高的一个IP如果连接数超过150，则通过 iptables阻止访问：<br />
#!/bin/sh<br />
status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1`<br />
NUM=`echo $status|awk '{print $1}'`<br />
IP=`echo $status|awk '{print $2}'`<br />
result=`echo "$NUM &gt; 150" | bc`<br />
if [ $result = 1 ]<br />
then<br />
  echo IPIP is over $NUM, BAN IT!<br />
  /sbin/iptables -I INPUT -s $IP -j DROP<br />
fi</p>
<p>运行crontab -e，将上述脚本添加到crontab每分钟自动运行：<br />
* * * * * /root/xxxx.sh<br />
通过apache自带的ab工具进行服务器压力测试：<br />
ab -n 1000 -c 100 <a href="http://www.xxx.com/bbs/index.php">http://www.xxx.com/bbs/index.php</a><br />
测试完成后，我们就可以看到系统中有IP被封的提示：<br />
[root@xxxxxx ~]#tail /var/spool/mail/root<br />
Content-Type: text/plain; charset=ANSI_X3.4-1968<br />
Auto-Submitted: auto-generated<br />
X-Cron-Env: &lt;SHELL=/bin/sh&gt;<br />
X-Cron-Env: &lt;HOME=/root&gt;<br />
X-Cron-Env: &lt;ATH=/usr/bin:/bin&gt;<br />
X-Cron-Env: &lt;LOGNAME=root&gt;<br />
X-Cron-Env: &lt;USER=root&gt;</p>
<p>IP:58.246.xx.xx is over 1047, BAN IT!<br />
至此，又一次HTTP GET FLOOD防御成功。</p>
<p>2.根据特征码屏蔽请求(对CC攻击效果较好)<br />
一般同一种CC攻击工具发起的攻击请求包总是相同的，而且和正常请求有所差异。<br />
当服务器遭遇CC攻击时，我们可以快速查看日志，分析其请求的特征，比如User-agent。下面的是某一次CC攻击时的User-agent<br />
Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate<br />
几乎没有正常的浏览器会在User-agent中带上"must-revalidate"这样的关键字。所以我们可以以这个为特征进行过滤，将User-agent中带有"must-revalidate"的请求全部拒绝访问：<br />
if ($http_user_agent ~ must-revalidate) {<br />
return 403;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hackerfans.com/hacker-skills/linux-vps/nginx-anti-ddos-cc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

