php中伪静态的实现原理和实现方法
提到伪静态这个词,相信有点网站基础的人都不会陌生。为了迎合搜索引擎的友好度,现在大量的网站都在使用伪静态的方式实现对URL动态参数的重写。本文中泰州网站建设公司宇易网络将会跟大家一起探讨一下伪静态的实现原理和实现方法。
我们先来说一下实现方法:
set_time_limit(10); $id=$_GET["id"]; $id=str_replace(" ","%20",$id); $id=str_replace("=","%3D",$id); $url="http://www.xxx.com/index.php/library/more/id/$id.html"; $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,"$url"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//启用时将curl_init()获取的信息以文件流的形式返回,而不是直接输出 curl_setopt($ch,CURLOPT_HEADER,0);//启用时会将头文件的信息作为数据流输出 $output=curl_exec($ch); curl_close($ch); print_r($output);
我们将该文件放入本地Apache服务器的根目录中,名称为test.php。在浏览器中输入http://127.0.0.1/test.php?id=1
伪静态实现的方法一(利用Apache服务器的功能):
1、检查Apache是否支持mod_rewrite
2、让Apache 支持.htaccess
3、建立.htaccess文件
4、规则:
RewriteEngine on RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html$index.php?action=$1&id=$2([a-zA-Z]{1,})-([0-9]{1,}) 是 URL长啥样?
$1 是([a-zA-Z]{1,}) 所匹配的
$2 是[0-9]{1,} 所匹配的
比如说:www.xx.com/page-18.html,真实的URL如下:action = page, id = 18
PHP伪静态实现方法二(编码实现)
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"]
echo $Php2Html_FileUrl
$Php2Html_UrlString = str_replace("?","",str_replace("/","",strrchr(strrchr($Php2Html_FileUrl,"/"),"?")) )) /* 内层的strrchr出来:/test.php?id|1@action|2 外层的strrchr出来:id|1@action|2 内层的str_replace出来:把 / 号去掉,本例子 没有 外层的str_replace出来:把 ?号去掉,本例子 没有 */ $Php2Html_UrlQueryStrList = explode("@",$Php2Html_UrlString); /*把str变成以@为界限划分的数组:id|1 和 action|2*/ foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr) { $Php2Html_TmpArray = explode("|",$Php2Html_UrlQueryStr); /* id => 1 和 action => 2*/ $_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1]; } $Php2Html_UrlString = str_replace("?","",str_replace("/","",strrchr(strrchr($Php2Html_FileUrl,"/"),"?")) )) /* 内层的strrchr出来:/test.php?id|1@action|2 外层的strrchr出来:id|1@action|2 内层的str_replace出来:把 / 号去掉,本例子 没有 外层的str_replace出来:把 ?号去掉,本例子 没有 */ $Php2Html_UrlQueryStrList = explode("@",$Php2Html_UrlString); /*把str变成以@为界限划分的数组:id|1 和 action|2*/ foreach($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr) { $Php2Html_TmpArray = explode("|",$Php2Html_UrlQueryStr); /* id => 1 和 action => 2*/ $_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1]; }PHP伪静态实现方法三(编码实现)
$filename = basename($_SERVER["SCRIPT_NAME"]); echo $_SERVER["SCRIPT_NAME"]; echo $filename; if(strtolower($filename) == 'test.php'){ if(!empty($_GET[id])){ $id=intval($_GET[id]); echo $id; $action = intval($_GET[action]); echo $action; }else{ $nav=$_SERVER["REQUEST_URI"]; $script=$_SERVER["SRCIPT_NAME"]; //这句话应该是把URL前面那段给搞掉。。剩下 "1/2"之类的。。 $nav=ereg_replace("$script","",urldecode($nav)); echo $nav; $vars = explode("/",$nav); print_r($vars); $id=intval($vars[1]); $action=intval($vars[2]); } echo $id.'&'.$action; } $filename = basename($_SERVER["SCRIPT_NAME"]); echo $_SERVER["SCRIPT_NAME"]; echo $filename; if(strtolower($filename) == 'test.php'){ if(!empty($_GET[id])){ $id=intval($_GET[id]); echo $id; $action = intval($_GET[action]); echo $action; }else{ $nav=$_SERVER["REQUEST_URI"]; $script=$_SERVER["SRCIPT_NAME"]; //这句话应该是把URL前面那段给搞掉。。upg4hw剩下 "1/2"之类的。。 $nav=ereg_replace("$script","",urldecode($nav)); echo $nav; $vars = explode("/",$nav); print_r($vars); $id=intval($vars[1]); $action=intval($vars[2]); } echo $id.'&'.$action; }PHP伪静态实现方法四(编码实现)
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);//去掉尾部的htm或html