PHP伪静态

帝国CMS,动态栏目启用伪静态功能,且已上传.htaccess 文件。

伪静态

从形式上看是一个静态地址,实际上还是访问的动态地址,

比如:访问:

实际上是:;

作用:主要是利于seo,静态页面的方式,比较容易被搜索引擎给搜集。

  Localhost/6.php     输入 localhost/6.html
同样能输出跟6.php同样的内容   

 

1、实现原理:

使用apac he的rewrite机制。

rewrite机制:就是一个url的重写机制,

2、如何开启重写模块,

在httpd.conf文件中进行开启。

 

 

3、配置方式:

  1)直接在配置虚拟主机httpd-vhosts.conf进行配置
,每次修改apache的文件都需要重启apache

    <VirtualHost *:80>

  #主机名

   ServerName  localhost

   #开启重写引擎

   RewriteEngine on

   #写重写规则

   RewriteRule /index.html  /6.php [L]

   #文件的根目录路径

   DocumentRoot  “E:/server/apache/htdocs”

<Directory  “E:/server/apache/htdocs”>

   #结构样式

  #打开默认的首页

DirectoryIndex  index.php  index.html

#打开默认索引列表  

    Options  Indexes  FollowSymLinks    

   #权限

  #权限控制   先拒绝后允许

   Order Deny,Allow  

 #允许所有用户进行访问

   AllowOverride All

    Allow from  All   

  </Directory>

</VirtualHost>

  1. httpd.conf文件

<Directory />

    AllowOverride all    改成all

    Require all denied

</Directory>

  3)分布式配置 具体的.htaccess文件中的配置:
在网站的根目录下创建一个文件,文件名为.htaccess

  <ifModule rewrite_module>

   #打开重写引擎

   RewriteEngin on

   #RewriteCond 判断条件(服务器变量) 条件表达式  [条件标志]

   #RewriteRule  规则url   目标url  [规则的标志]   (.*).html  
$1.php [L]

 </ifModule>

4、具体的语法:

RewriteEngine on  #开启重写引擎

RewriteCond  重写条件,要满足一定的条件才重写。

 

CI框架中的重写规则

第一步: 在虚拟主机开启  AllowOverride All

第二步: //配置伪静态时 在CI框架的配置文件 config中 修改 URL协议为

$config[‘uri_protocol’]     = ‘PATH_INFO’;

 

RewriteCond条件的语法:

RewriteCond   判断依据   条件表达式 [条件标志]

 

(1)判断依据:可以使用服务器变量:

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

比如:%{REQUEST_FILENAME}  表示请求的文件名称

比如:%{HTTP_REFERER}:表示请求的来源。

 

(2)条件表达式:可以是一些标志,或者字符串

 

比如:

-d   表示是一个目录

-f    表示是一个文件

 

RewriteCond %{REQUEST_FILENAME} !-d  //如果请求的路径不是一个目录

RewriteCond %{REQUEST_FILENAME} !-f  //如果请求的路径不是一个文件

(3)[条件标志]

[NC]表示不区分大小写

[OR],在默认情况下多个条件(RewriteCond)之间是并且的关系。如果我们使用或关系则后台添加[OR]标志。

 

 

 

RewriteRule  语法规则

RewriteRule   规则的url(可以使用正则)  目标url  [规则标志]

规则标志:

[F] 表示:表示禁止重写

[NC] 表示:不区分大小写

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的
友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就
损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一
类的动态脚本来处理的。

用IIS的404错误处理机制来实现的。这个比rewrite技术要灵活的多。

首先,设置站点属性-自定义错误,找到HTTP错误404,然后编辑属性->消息类型选中URL->URL填入“/index.asp”,或您的错误处理页面。

这样,比如用户或蜘蛛访问

在index.asp里添加

CurrDomain=Request.ServerVariables(“HTTP_HOST”) ‘当前访问域名

CurrURL=Replace(Request.ServerVariables(“QUERY_STRING”),”404;”)
‘当前访问URL

此时的CurrURL应该是:12345.html .

这样,就得到用户正在试图访问的页面。然后提取里边的文章ID(应该为:12345),用正则,这里就不多说了。

然后到数据库里提取出文章内容。输出到页面里,就OK了。

这样。用户或蜘蛛看到的URL还是他访问的URL.而我们对内容的处理上可以用到了动态技术。这就是我们想要的结果。说得简单了一些。但是基本思路就是这样了。

 

伪静态

1、确定栏目等设置正确。

PHP如何实现网址伪静态

Apache的
mod_rewrite是比较强大的,在进行网站建设时,可以通过这个模块来实现伪静态。

主要步骤如下: 1.检测 Apache是否开启mod_rewrite功能    
可以通过php提供的phpinfo()函数查看环境配置,找到“Loaded
Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设
置。如果没有开启“mod_rewrite”,则打开目录 apache目录下的“/apache/conf/”
,找到 httpd.conf 文件,再找到“LoadModule
rewrite_module”,将前面的”#”号删除即表示取用该功能。   
如果没有查找到“LoadModule” 区域,可以在最后一行加入“LoadModule
rewrite_module
,modules/mod_rewrite.so”(独占一行),之后重启apache服务器。再通过phpinfo()函数查看环境配置就有
“mod_rewrite”为项了.。

 2.让apache服务器支持.htaccess   
如何让自己的本地APACHE服务器支持:“htaccess”呢?
只需修改apache的httpd.conf设置就可以让 APACHE支持“.htaccess”了。打开
APACHE目录的CONF目录下的httpd.conf文件,找到: Options
FollowSymLinks AllowOverride None 改为 Options
FollowSymLinks AllowOverride All 就行了。

 3.建立.htaccess 文件   
建立.htaccess文件时要注意,不能直接建,方法是通过记事本中的另存为菜单,在文件名窗口输入:“.htaccess”,然后点击保存。

 4.rewrite 规则学习   
在新建.htaccess文件之后,就在里面写入以下内容: RewriteEngine on
#rewriteengine为重写引擎开关on为开启off为关闭 RewriteRule
([0-9]{1,})$index.php?id=$1 在这里,RewriteRule是重写规则,是用正则表达式的句子,([0-9]{1,})表
示由数字组成的,$表示结束标志,表示以数字结束!如果要实现伪静态页面,规则如下: RewriteEngine
on RewriteRule
([a-zA-Z]{1,})-([0-9]{1,}).html$index.php?action=$1&id=$2 在为个正则表达式中,
([a-zA-Z]{1,})-([0-9]{1,}).html$是规则,index.php?action=$1&id=$2是要替换的格
式,$1代表第1括号匹配的值,$2代表第二个括号的值,如此类推! 测试PHP脚本如下: index.php文件中的代码如下: echo
‘你的Action值为:’ . $_GET[‘action’]; echo ‘ ’; echo ‘ID值为:’ .
$_GET[‘id’]; ?>

在浏览器地址栏输入: localhost/page-18.html 输出的是: 你的Action值为:page ID值为:18

 

如何选择真静态和伪静态?

网站实时性要求高,不要使用静态化(真静态,伪静态均不适宜)。

如果网站访问量较小,没有必要使用静态化技术

如果数据项目不多,但是访问频率极大,建议使用真静态,比如新浪新闻频道。

如果数据项目海量,使用真静态会生成海量的html静态页面,建议使用伪静态。

在一个大型网站中,静态化技术是综合使用的,这个需要大家经验的积累,多做项目。(sina网站:新闻频道,真静态,基金频道:伪静态,管理后台:不使用静态技术)

 

伪静态

2、确定 空间支持.htaccess 文件,具已上传.htaccess 文件。

伪静态页面,其目的是为了更好的被搜索引擎收录而通过一定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。

3、确定.htaccess 文件伪静态规则正确。

但是现在很多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’,

    ‘//’=>’/’,

    ‘/’=>’/’,

发表评论

电子邮件地址不会被公开。 必填项已用*标注