php静态化页面方法,伪静态的也可以
2015-07-11 · 知道合伙人软件行家
emeipanda
知道合伙人软件行家
向TA提问 私信TA
知道合伙人软件行家
采纳数:329
获赞数:1494
曾获联想、华为、Juniper认证,现任职于四川省内江市GPS卫星监控中心总工程师,主持技术管理工作逾10年。
向TA提问 私信TA
关注
展开全部
PHP伪静态写法--其一
伪静态又名:URL重写
主要是为了SEO而生的。(SEO是什么?这个不用问我吧。呵呵~搞网络的不懂SEO那就~~~~)
方法一:
比如这个网页
http://www.2cto.com /soft.php/1,100,8630.html
其实处理的脚本是soft.php 参数为1,100,8630
相当于soft.php?a=1&b=1=100&c=8630 只不过这样的URL太难记。搜索引擎也不喜欢。
真静态只是完全生成了HTML。
客户端访问的时候直接输出。不用脚本解释。在流量非常大的时候(比如每天有上百万的访问量的时候)会起到很好的效果。也就是说服务器端实实在在的存在这个HTML页面。
当然在你网站的流量没有那么大的时候。URL重写是最好的方法(个人观点,大流量的时候可以考虑负载均衡了。同样没有关系)
附URL重写的方法有很多种,APACHE,IISREWRITE。甚至PHP脚本都可以直接处理。比如上例中就是PHP脚本直接处理(该方法好处是大流量的时候直接减轻WEB伺服器的压力。PS:同样也是个人观点:
================================================
下面以程序为例讲一下PHP伪静态的程序实现方法,其实这方法我之前已经有在其它论坛社区发过
程序为例:
http://www.2cto.com /soft.php/1,100,8630.html
CODE:
//利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match("/\/(\d+),(\d+),(\d+)\.html/si",$path_info,$arr_path)){
$gid =intval($arr_path[1]); //取得值 1
$sid =intval($arr_path[2]); //取得值100
$softid =intval($arr_path[3]); //取得值8630
}else die("Path:Error!");
//相当于soft.php?gid=1&sid=100&softid=8630
//就是这么简单了。~)
方法二:
一 打开 Apache 的配置文件 httpd.conf 。
二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉
三 在 httpd.conf中添加:
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+.html
RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+).html 1.php?__is_apache_rewrite=1&__rewrite_arg=2
</IfModule>
四 要实现asp帖子URL到php帖子的映射,在 第三步的<IfModule mod_rewrite.c>和</IfModule>之间添加:
RewriteMap tolowercase int:tolower
RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)=d+ [NC]
RewriteRule ^(.*(?:index|dispbbs)).asp 1.php?{tolowercase:%{QUERY_STRING}}&__is_apache_rewrite=1
五 保存httpd.conf并重启Apache
方法三:
<?php
/*
功能:PHP伪静态化页面的实现
具体用法:
例如链接为:test.php/year/2006/action/_add.html
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
*/
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
$script_name=$_SERVER["SCRIPT_NAME"];
$nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1);
$nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm
$vars = explode("/",$nav);
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]"]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
echo $yearn;
echo $action;
?>
<?php
/*
功能:PHP伪静态化页面的实现
具体用法:
例如链接为:test.php/year/2006/action/_add.html
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
*/
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
$script_name=$_SERVER["SCRIPT_NAME"];
$nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1);
$nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm
$vars = explode("/",$nav);
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]"]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
echo $yearn;
echo $action;
?>
伪静态又名:URL重写
主要是为了SEO而生的。(SEO是什么?这个不用问我吧。呵呵~搞网络的不懂SEO那就~~~~)
方法一:
比如这个网页
http://www.2cto.com /soft.php/1,100,8630.html
其实处理的脚本是soft.php 参数为1,100,8630
相当于soft.php?a=1&b=1=100&c=8630 只不过这样的URL太难记。搜索引擎也不喜欢。
真静态只是完全生成了HTML。
客户端访问的时候直接输出。不用脚本解释。在流量非常大的时候(比如每天有上百万的访问量的时候)会起到很好的效果。也就是说服务器端实实在在的存在这个HTML页面。
当然在你网站的流量没有那么大的时候。URL重写是最好的方法(个人观点,大流量的时候可以考虑负载均衡了。同样没有关系)
附URL重写的方法有很多种,APACHE,IISREWRITE。甚至PHP脚本都可以直接处理。比如上例中就是PHP脚本直接处理(该方法好处是大流量的时候直接减轻WEB伺服器的压力。PS:同样也是个人观点:
================================================
下面以程序为例讲一下PHP伪静态的程序实现方法,其实这方法我之前已经有在其它论坛社区发过
程序为例:
http://www.2cto.com /soft.php/1,100,8630.html
CODE:
//利用server变量 取得PATH_INFO信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分
if(@$path_info =$_SERVER["PATH_INFO"]){
//正则匹配一下参数
if(preg_match("/\/(\d+),(\d+),(\d+)\.html/si",$path_info,$arr_path)){
$gid =intval($arr_path[1]); //取得值 1
$sid =intval($arr_path[2]); //取得值100
$softid =intval($arr_path[3]); //取得值8630
}else die("Path:Error!");
//相当于soft.php?gid=1&sid=100&softid=8630
//就是这么简单了。~)
方法二:
一 打开 Apache 的配置文件 httpd.conf 。
二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉
三 在 httpd.conf中添加:
<IfModule mod_rewrite.c>
RewriteEngine On
#RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+.html
RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+).html 1.php?__is_apache_rewrite=1&__rewrite_arg=2
</IfModule>
四 要实现asp帖子URL到php帖子的映射,在 第三步的<IfModule mod_rewrite.c>和</IfModule>之间添加:
RewriteMap tolowercase int:tolower
RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)=d+ [NC]
RewriteRule ^(.*(?:index|dispbbs)).asp 1.php?{tolowercase:%{QUERY_STRING}}&__is_apache_rewrite=1
五 保存httpd.conf并重启Apache
方法三:
<?php
/*
功能:PHP伪静态化页面的实现
具体用法:
例如链接为:test.php/year/2006/action/_add.html
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
*/
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
$script_name=$_SERVER["SCRIPT_NAME"];
$nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1);
$nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm
$vars = explode("/",$nav);
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]"]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
echo $yearn;
echo $action;
?>
<?php
/*
功能:PHP伪静态化页面的实现
具体用法:
例如链接为:test.php/year/2006/action/_add.html
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
*/
function mod_rewrite(){
global $_GET;
$nav=$_SERVER["REQUEST_URI"];
$script_name=$_SERVER["SCRIPT_NAME"];
$nav=substr(ereg_replace("^$script_name","",urldecode($nav)),1);
$nav=preg_replace("/^.ht(m){1}(l){0,1}$/","",$nav);//这句是去掉尾部的.html或.htm
$vars = explode("/",$nav);
for($i=0;$i<Count($vars);$i+=2){
$_GET["$vars[$i]"]=$vars[$i+1];
}
return $_GET;
}
mod_rewrite();
$yearn=$_GET["year"];//结果为'2006'
$action=$_GET["action"];//结果为'_add'
echo $yearn;
echo $action;
?>
Storm代理
2023-08-29 广告
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I...
点击进入详情页
本回答由Storm代理提供
展开全部
PHP实现伪静态化页面方法一:
在你的程序初始化时使用如下代码:
<?php
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
$Php2Html_UrlString = str_replace("/", "", strrchr($Php2Html_FileUrl, "/"));
$Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString);
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr);
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
echo '假静态:$_GET变量<br />';
print_r($_GET);
?>
然后php中调用$_GET变量就像平常一样了。
连接使用方式:
****.php/param1|1234@param2|4321
和****.php?param1=1234¶m2=4321一样。
PHP实现伪静态化页面方法二:通过URL Rewrite实现链接静态化
我们知道搜索引擎对于静态页面是非常友好的,因此很多网站通过生成静态页面等手段方便爬虫抓取自己网站的内容。但是有时候一些应用并不适合全部静态化,比如数据变化非常大的论坛/贴吧系统,这时候我们可以通过URL重写来实现链接的伪静态化,即网站对外使用静态化的链接,而内部实际上仍然使用动态页面的 URL形式。比如像这样一个链接:http://www.ci123.com/abc.php?action=a&id=1,我们可以改写成http://www.ci123.com/abc/a/1.html的形式。这是搜索引擎优化最重要的内容之一,它还有一个额外的好处,可以使页面有一个永久链接,即便以后网站系统内部链接有变化,通过适当改变Rewrite规则就可以保证原先的外部URL一直有效。
下面介绍2种简单的Apache+PHP下实现URL重写的方法,第一种适合有服务器配置权限的用户,第二种适合租用空间的用户,也作为我近期的学习心得的整理。
1、对于有服务器配置权限的用户,推荐使用Apache的mod_rewrite模块,这里假设已经安装好mod_rewrite模块。打开Apache的配置文件,找到相应主机的部分,添加以下代码:
RewriteEngine On
RewriteRule ^/abc/([a-z]+)/([0-9]+).html$ /abc.php?action=$1&id=$2
然后在shell里执行service httpd reload,让Apache重新载入配置就好了。现在在PHP页面里面我们可以把链接写成 abc/a/1.html的形式,Apache在解析这个 URL的时候会rewrite成abc.php?action=a&id=1的形式,并返回正确的页面。运用正则表达式我们可以实现几乎任何我们想要的链接形式,mod_rewrite模块的功能异常强大,这里只是一个及其简单的应用。
2、对于租用空间的用户,一般都没有办法修改Apache的配置,这里有个变通的方法,原理是这样的:当要传递参数访问PHP 页面时,正常情况下是通过自动全局变量$_GET来获得,比如上面的链接,在页面里可以通过$_GET['action'] 和 $_GET['id'] 来获得,重写URL后就不行了。现在在每个页面里require一个url_rewrite.php文件,里面代码如下:
$filename = basename($_SERVER['SCRIPT_NAME']);
if (strtolower($filename) == "abc.php"){
if (!empty($_GET[id])){
$id = intval($_GET[id]);
$action = intval($_GET[action]);
}
else {
$nav = $_SERVER["REQUEST_URI"];
$script = $_SERVER["SCRIPT_NAME"];
$nav = ereg_replace("^$script", "", urldecode($nav));
$vars = explode("/", $nav);
$action = intval($vars[1]);
$id = intval($vars[2]);
}
}
这样$action和$id也得到了,页面里链接可以写成abc.php/a/1的形式来访问相应页面。
需要注意的是这种PHP实现伪静态化页面方法效率较第一种低,第一种方法是在WEB服务器URL解析过程中实现的,而这里是在PHP页面解析过程里实现的,第2种方法只是变通,不得已而为之,要修改链接形式很不方便也不灵活。
在你的程序初始化时使用如下代码:
<?php
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
$Php2Html_UrlString = str_replace("/", "", strrchr($Php2Html_FileUrl, "/"));
$Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString);
foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr)
{
$Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr);
$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}
echo '假静态:$_GET变量<br />';
print_r($_GET);
?>
然后php中调用$_GET变量就像平常一样了。
连接使用方式:
****.php/param1|1234@param2|4321
和****.php?param1=1234¶m2=4321一样。
PHP实现伪静态化页面方法二:通过URL Rewrite实现链接静态化
我们知道搜索引擎对于静态页面是非常友好的,因此很多网站通过生成静态页面等手段方便爬虫抓取自己网站的内容。但是有时候一些应用并不适合全部静态化,比如数据变化非常大的论坛/贴吧系统,这时候我们可以通过URL重写来实现链接的伪静态化,即网站对外使用静态化的链接,而内部实际上仍然使用动态页面的 URL形式。比如像这样一个链接:http://www.ci123.com/abc.php?action=a&id=1,我们可以改写成http://www.ci123.com/abc/a/1.html的形式。这是搜索引擎优化最重要的内容之一,它还有一个额外的好处,可以使页面有一个永久链接,即便以后网站系统内部链接有变化,通过适当改变Rewrite规则就可以保证原先的外部URL一直有效。
下面介绍2种简单的Apache+PHP下实现URL重写的方法,第一种适合有服务器配置权限的用户,第二种适合租用空间的用户,也作为我近期的学习心得的整理。
1、对于有服务器配置权限的用户,推荐使用Apache的mod_rewrite模块,这里假设已经安装好mod_rewrite模块。打开Apache的配置文件,找到相应主机的部分,添加以下代码:
RewriteEngine On
RewriteRule ^/abc/([a-z]+)/([0-9]+).html$ /abc.php?action=$1&id=$2
然后在shell里执行service httpd reload,让Apache重新载入配置就好了。现在在PHP页面里面我们可以把链接写成 abc/a/1.html的形式,Apache在解析这个 URL的时候会rewrite成abc.php?action=a&id=1的形式,并返回正确的页面。运用正则表达式我们可以实现几乎任何我们想要的链接形式,mod_rewrite模块的功能异常强大,这里只是一个及其简单的应用。
2、对于租用空间的用户,一般都没有办法修改Apache的配置,这里有个变通的方法,原理是这样的:当要传递参数访问PHP 页面时,正常情况下是通过自动全局变量$_GET来获得,比如上面的链接,在页面里可以通过$_GET['action'] 和 $_GET['id'] 来获得,重写URL后就不行了。现在在每个页面里require一个url_rewrite.php文件,里面代码如下:
$filename = basename($_SERVER['SCRIPT_NAME']);
if (strtolower($filename) == "abc.php"){
if (!empty($_GET[id])){
$id = intval($_GET[id]);
$action = intval($_GET[action]);
}
else {
$nav = $_SERVER["REQUEST_URI"];
$script = $_SERVER["SCRIPT_NAME"];
$nav = ereg_replace("^$script", "", urldecode($nav));
$vars = explode("/", $nav);
$action = intval($vars[1]);
$id = intval($vars[2]);
}
}
这样$action和$id也得到了,页面里链接可以写成abc.php/a/1的形式来访问相应页面。
需要注意的是这种PHP实现伪静态化页面方法效率较第一种低,第一种方法是在WEB服务器URL解析过程中实现的,而这里是在PHP页面解析过程里实现的,第2种方法只是变通,不得已而为之,要修改链接形式很不方便也不灵活。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里是jetee.cn中静态化会员列表部分,根据这部分代码,可以理解静态化的一些概念。
静态化函数部分
/**
* @get list member item 获得静态化模板中要替换变量的内容。
* @param str: To replace the string
* @return string
*/
function get_staticize_replace_str()
{
$replace_str=""; //replace string
$query="select member_id,email_name from member";
$result=Mysql::query($query);
while($row=Mysql::fetch_assoc($result))
{
$replace_str.="<li>".$row["member_id"]."</li>";
$replace_str.="<li>".$row["email_name"]."</li><br>";
}
return $replace_str;
}
/**
* @替换静态化模板中的变量生成静态化页面。
* @
* @return void
*/
function staticize_list_member()
{
$replace_str=$this->get_staticize_replace_str();
$templet=fopen(TENDAO_DIR."/templets/default/list_member.html","r");
$new_file=fopen(TENDAO_DIR."/member/list_member.html","w");
while(!feof($templet))
{
$ripe=fgets($templet);
$ripe=str_replace("{member_items}",$replace_str,$ripe);
fwrite($new_file,$ripe);
}
if (file_exists(TENDAO_DIR."/member/list_member.html")) {
Msg("静态化会员列表成功!返回主页中……",TENDAO_ROOT,0,3000);
exit();
} else {
Msg("静态化会员列表没有成功!返回主页中……",TENDAO_ROOT,0,3000);
}
fclose($templet);
fclose($new_file);
}
/**
* @静态化模板
* @
* @return void
*/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>会员列表</title>
<style type="text/css">
body{width:980px; margin:0 auto;}
ul{list-style:none; margin:0 auto;}
.member_list .member_header{ width:400px; height:20px;border-left:1px solid #b9df92;border-top:1px solid #b9df92;border-right:1px solid #f73442;background-color:#f73442;
}
.member_list .member_item{width:400px; border-left:1px solid #aaaaaa;border-top:0;border-right:0;border-bottom:1px solid #aaaaaa;background-color:#efefef;}
.member_list li{
display:block;
width:199px;
height:18px;
float:left;
overflow:hidden;
border-right:1px solid #888888;
}
.clear_float{ clear:left;}
</style>
</head>
<body>
<div class="member_list">
<ul class="member_header">
<li>member_id</li>
<li>email_name</li>
</ul>
<ul class="member_item">
<!-- style like
<li>{member_id}</li>
<li>{email_name}</li>
<li>{member_id}</li>
<li>{email_name}</li>
<li>{member_id}</li>
<li>{email_name}</li>
-->{member_items}
</ul>
</div>
</body>
</html>
静态化函数部分
/**
* @get list member item 获得静态化模板中要替换变量的内容。
* @param str: To replace the string
* @return string
*/
function get_staticize_replace_str()
{
$replace_str=""; //replace string
$query="select member_id,email_name from member";
$result=Mysql::query($query);
while($row=Mysql::fetch_assoc($result))
{
$replace_str.="<li>".$row["member_id"]."</li>";
$replace_str.="<li>".$row["email_name"]."</li><br>";
}
return $replace_str;
}
/**
* @替换静态化模板中的变量生成静态化页面。
* @
* @return void
*/
function staticize_list_member()
{
$replace_str=$this->get_staticize_replace_str();
$templet=fopen(TENDAO_DIR."/templets/default/list_member.html","r");
$new_file=fopen(TENDAO_DIR."/member/list_member.html","w");
while(!feof($templet))
{
$ripe=fgets($templet);
$ripe=str_replace("{member_items}",$replace_str,$ripe);
fwrite($new_file,$ripe);
}
if (file_exists(TENDAO_DIR."/member/list_member.html")) {
Msg("静态化会员列表成功!返回主页中……",TENDAO_ROOT,0,3000);
exit();
} else {
Msg("静态化会员列表没有成功!返回主页中……",TENDAO_ROOT,0,3000);
}
fclose($templet);
fclose($new_file);
}
/**
* @静态化模板
* @
* @return void
*/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>会员列表</title>
<style type="text/css">
body{width:980px; margin:0 auto;}
ul{list-style:none; margin:0 auto;}
.member_list .member_header{ width:400px; height:20px;border-left:1px solid #b9df92;border-top:1px solid #b9df92;border-right:1px solid #f73442;background-color:#f73442;
}
.member_list .member_item{width:400px; border-left:1px solid #aaaaaa;border-top:0;border-right:0;border-bottom:1px solid #aaaaaa;background-color:#efefef;}
.member_list li{
display:block;
width:199px;
height:18px;
float:left;
overflow:hidden;
border-right:1px solid #888888;
}
.clear_float{ clear:left;}
</style>
</head>
<body>
<div class="member_list">
<ul class="member_header">
<li>member_id</li>
<li>email_name</li>
</ul>
<ul class="member_item">
<!-- style like
<li>{member_id}</li>
<li>{email_name}</li>
<li>{member_id}</li>
<li>{email_name}</li>
<li>{member_id}</li>
<li>{email_name}</li>
-->{member_items}
</ul>
</div>
</body>
</html>
参考资料: http://jetee.cn/PHPjiayuan/200811/10-8.html
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
PHP静态化页面的话,可以用file_put_contents() 函数生成静态的html页面,伪静态的话,这个已经不属于PHP的范围了,这个是对服务器进行配置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用smarty在显示之前fetch的结果保存到文件中即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询