伪静态
伪静态
伪静态页面,其目的是为了更好的被搜索引擎收录而通过一定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。
但是现在很多CMS网站程序,都可以把动态页面直接生成真静态的,就是所访问的页面是真真实实存的,根静态页面一样。这样的好处是访问速度快,不需要频繁去读取筛选服务器里的数据,减轻了服务器的压力,同时也能更好地被搜索引擎收录。
主要不足
1、当然犹如一篇文章的作者所说的:"如果流量稍大一些使用伪静态就出现CUP使 用超负荷,我的同时在线300多人就挂了,而不使用伪静态的时候同时在线超500人都不挂,我的IIS(互联网信息服务)数是1000。”确实是这样的,由于伪静态是用正则 判断而不是真实地址,分别显示哪个页面的责任也由直接指定转由CPU来判断了,所以CPU占有量的上升,确实是伪静态最大的弊病。
2、网站承受力低。
另外,会造成网站可承受同时在线人数剧减。如果你的网站可以保证1000人同时访问的话,那么做了伪静态处理之后,300人访问就足以让你网站挂掉。
3、网页打开慢。
伪静态页面打开速度快,简直太搞笑了,伪静态仍然要读取数据库,还额外的多了一个.重写网址.的过程,其他的步骤绝对不会比动态少,怎么会快呢?
4、大量的重复页面。
做了伪静态后,原有的页面也可以访问,这就造成了大量的伪静态页面和动态页面重复,对网站极为不好。
5、需要服务器的支持。
并不是所有的服务器都支持伪静态的,这无形中又增加了成本。
所以,如果网址中的动态参数没有达到想想搜索引擎收录的程度,动态要比伪静态好的多。
6、造成真正的静态网页无法访问。
如果php伪静态成html,那么真正的静态页就无法访问了。(可通过修改服务器配置解决,可是你又何必去费这把力气呢?)
方法步骤
找到apache的配置文件httpd.conf(文件在conf目录下),先必须得让服务器支持mod_rewrite。
mod_rewrite:
此模块提供了一个基于正则表达式
分 析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依 赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。
一般mod_rewrite默认是不启动的,这时我们需要手动启用它。
找到AllowOverride None 改成 AllowOverride All,
AllowOverride:
常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override ,即
< Directory />AllowOverride None< /Directory>
在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 ".htaccess" 作用域的指令都允许出现在 .htaccess 文件中。
而对于 URL rewrite 来说,至少需要把目录设置为
< Directory /myblogroot/>AllowOverride FileInfo< /Directory>
AllowOverride的参数
:
AuthConfig 允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。FileInfo 允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。Indexes 允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。Limit 允许使用控制主机访问的指令(Allow, Deny, Order)。Options[=Option,...] 允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。
注:AllowOverride 的参数设置为ALL,表示整台服务器上都支持URL规则重写。Apache 服务器要读每个网站下目录下的 .htaccess 文件。如果没有这个文件,或者这个文档没有定义任何关于URL重写的规则就不会有任何效果。 对于不同的网址,需要在APACHE中增加如下内容 Options FollowSymLinks AllowOverride None
在.htaccess中有两种写法 第一种比较全 但是常用的是第二种
第一种:
Options +FollowSymLinks
IndexIgnore **
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . Index.php 【L】
mod_rewrite
要求有followsymlinks,否则会显示500内部服务器错误。IndexIgnore让指定file排除在显示列表之外,也就是忽略显示,也就是不显示,file可以是文件全名,或是shell样式的通配符。RewriteCond %{REQUEST_FILENAME} !-f,这句话的意思是:如果文件存在,就直接访问文件,不进行下面的RewriteRule.%{REQUEST_FILENAME} 请求的文件名!-f 不是文件或不存在!-d 不是目录或不存在[L] 这是最后一个匹配项,不再往下匹配
RewriteCond还有别的 比如!-s 是否是长度不为0的regular的文件
-i 是否为symbolice link
-u 用subrequest检查某个URL是否存在
等等
YII中伪静态使用
Common->config->main.php
首先,在配置文件config/main.php的‘components‘ 段中,加入如下设置:‘urlManager‘=>array( ‘enablePrettyUrl‘ => true, //对url进行美化 ‘showScriptName‘ => false,//隐藏index.php ‘suffix‘ => ‘.html‘,//后缀 ‘enableStrictParsing‘=>FALSE,//不要求网址严格匹配,则不需要输入rules ‘rules‘ => []//网址匹配规则
)
rules实例
‘sitemap\.xml‘ => ‘site/sitemap‘, //网站地图
‘sitemap\.xsl‘ => ‘site/sitemapxsl‘, //网站索引
‘page/‘=>‘page/index‘, //单页
‘//cat_/page_‘=>‘/‘, //分页
‘//page_‘=>‘/‘, //分页
‘//cat_‘ => ‘/‘, //内容列表
‘tag/index/‘ => ‘tag/index‘, //标签搜索页
‘/‘=>‘/view‘,
‘//‘=>‘/‘,
‘/‘=>‘/‘,