大家好,“HDwiki百科建站讲座第三期”现在正式开始~~,今天,邀请到我们的嘉宾是李光明(论坛ID:wanner),他将就“apache、iis下的rewrite规则”的话题与各位站长朋友进行交流,下面,以热烈的掌声有请wanner
1、伪静态简介
伪静态就是:动态网页通过重写URL的方法实现去掉动态网页的参数,但在实际的网页目录中并没有必要实现存在重写的页面。
伪静态的目的
最主要的就是迎合搜索引擎方便搜索引擎蜘蛛(Spider)来抓取网页上的相关内容!方便用户访问网站 一个好网页如果是动态的用户在相互传播时感觉对方信任度不会高但一看一个静态页相对用户对网页的信任度就高点而且伪静态的后缀方式基本雷同 一看就知道是伪静态还是真的静态网页!伪静态对SEO有利,收录比动态会更好。
2、设置伪静态的要求
设置伪静态的要求,不同的服务器要求不一样,apache需要rewrite模块,iis需要安装ISAPI_rewrite软件.(若是虚拟主机,可向空间商咨询),独立主机的可以自行设置,一般apache默认都会有rewrite模块并开启,如果没开启,可打开apache的配置文件httpd.conf文件,LoadModule rewrite_module modules/mod_rewrite.so,将前面的井号去掉保持重启apache即可以下重点说说iis的ISAPI_rewrite软件。
l 在 IIS 管理器里选择网站,右键选择“属性”,如图一
l 选择你的站点,比方是默认站点,右键单击,选择属性,如图二
l 查看isapi筛选器
l 添加ISAPI筛选器,要选择的isapi.dll可以在网上下载得到
l 确定后查看刚刚添加是否成功
当状态时绿色向上的箭头的时候表示添加成功了,当rewrite环境配置好后就可以开启rewrite了。
3、开启伪静态
当确认已经安装rewrite模块后,便可开启hdwiki后台的rewrite规则了,apache用户开启后一般不会存在什么问题,系统已经自动生成了.htaccess文件, iis用户需要在论坛目录下手动添加httpd.ini文件(虚拟主机用户可咨询空间商该文件存在的位置),具体可参考http://kaiyuan.hudong.com/bbs/viewthread.php?tid=10341&extra=&highlight=iis%2B&page=1,该贴是4.0.5的规则,不过这个是通用规则,4.1同样适用,如果要全部单独写出的规则,可参考http://kaiyuan.hudong.com/bbs/viewthread.php?tid=13330&highlight=rewrite
4、rewrite规则
hdwiki4.1的手册中有apache,iis和nginx三种服务器下的rewrite规则
l apache下的规则
RewriteEngine on #表示开启rewrite
RewriteBase /hdwiki4/wikiframe/ #设置目录级重写的基准URL,指站点的路径
RewriteCond %{REQUEST_FILENAME} !-f #RewriteCond是指定义重写发生的条件,就是说一个RewriteRule 前面可以有多个RewriteCond,就是说,当符合RewriteCond 时,后面的RewriteRule 才会去执行,%{REQUEST_FILENAME}表示请求的文件名 !表示非 -f表示常规文件 ,该句表示请求的文件名为一个非常规文件时继续执行,否则不执行(常规文件时指a.txt这样的,可以直接下载的那种文件)
RewriteCond %{REQUEST_FILENAME} !-d #该句表示请求的文件名不是一个目录继续执行RewriteRule ^.*$ index.php?$0 #当上面两个条件都符合了,才会执行这条规则,该规则指,例如 abc会被指向index.php?abc
以上这些代码中,有很多正则表达式,就RewriteRule ^.*$ index.php?$0为例做讲解 ^表示以什么什么开始 ,比方^a 表示以a字符开始 ,'.'点这个字符时通配符,表示任意字符,*表示前面的表达式0到n个,.*表示0个或n个任意字符,$表示以什么结束,b$表示以b字符结束 $0表示匹配上的所有字符再看这个实例
RewriteRule ^/wiki/(.*)$ /index\.php\?doc-innerlink-$1
这个里面有$1表示^/wiki/(.*)$这个里面括号中匹配的字符串,如果后面还有括号的,就是$2$3....iis的rewrite规则基本和这个一样,ISAPI高版本中兼容上述写法,具体的可参考手册,另外要注意的是,很多iis的用户将hdwiki的规则和其他系统如discuz的规则写在了一起,导致iis冲突,一般可以通过文件夹名称来区别
例如,有些用户在httpd.ini中这样写
RewriteRule ^/(.*)/(.*)\.(htm|html|shtml|tpl|asp|jsp|php|do)$ /baike/index\.php\?$1可以改为RewriteRule ^/baike/(.*)\.(htm|html|shtml|tpl|asp|jsp|php|do)$ /baike/index\.php\?$1还有好多用户iis下不是用的这种通用写法,而是和dz一样写的是具体的,比如RewriteRule ^/baike/doc-view-(.*)$ /baike/index\.php\?doc-view$1这种写法完全可以,唯一不方便的就是如果hdwiki在新添加的功能,这个url可能无法被解析,因为没有相应的规则对应大家可以依葫芦画瓢照着写一个就可以了
l nginx下的写法
if ($request_filename !~* (.*)\.(css|js|gif|jpg|png|xml)){
# 修改以下语句中的 /hdwiki 为你的HDWiki目录地址,如果程序放在根目录中,请将 /hdwiki 修改为 /
rewrite ^(/hdwiki)/(.*)$ $1/index.php?$2;
}
仅开启以 http://mydomain/词条名 的rewrite规则,则添加如下代码:
# 修改以下语句中的 /hdwiki 为你的HDWiki目录地址,如果程序放在根目录中,请将 /hdwiki 修改为 /
rewrite ^(/hdwiki)/wiki/(.*)$ $1/index.php?doc-innerlink-$2 last;
其他服务器的rewrite规则,都是用正则表达式表示,写法略有不同
例如lighttpd的写法如下(http://kaiyuan.hudong.com/bbs/viewthread.php?tid=13353&highlight=rewrite)
url.rewrite = (
"^(.*)\/(attachment|category|comment|doc|edition|list|pms|reference|search|synonym|user|plugin|admin|pic|gift)([^\/]*)$" => "$1/index.php?$2$3"
)
5、伪静态的缺点
流量稍大一些使用伪静态就出现CPU使用超负荷,由于伪静态是用正则判断而不是真实地址,分辨到底显示哪个页面的责任也由直接指定转由CPU来判断了,所以CPU占有量的上升,确实是伪静态最大的弊病. 不过对于流量不大,但需要收录量的个人站点来说,伪静态算是个不错的选择
6、关闭hdwiki伪静态
当伪静态无法正常使用时,部分用户反映无法正常登录到后台关闭伪静态,新补丁中确保开启rewrite伪静态也能正常登录,可下载4.1的补丁包对于没有升级或没有打补丁的而无法登陆的同学,可以使用工具箱登陆到后台
主持人:
感谢光明的精彩回答,本次讲座到此结束。