首頁  >  文章  >  後端開發  >  php如何實現偽靜態的幾種方式總結

php如何實現偽靜態的幾種方式總結

伊谢尔伦
伊谢尔伦原創
2017-07-17 16:28:446451瀏覽

PHP偽靜態的使用主要是為了隱藏傳遞的參數名,說起偽靜態的實現方案,你是不是很爽快的回答"簡單,配置下apache的重寫規則就行了嘛"

但是你有沒有發現這種情況,你最近弄了很多新功能,每天上幾個新功能,每天都有很多偽靜態配置,才開始兩天維運同學還樂意配合,過兩天維運同學就要罵了。你麻痺,腦殘為什麼不一次搞完,天天麻煩我。但是了,你要上線啊,不得不苦逼的求運維同學了,然後說出一句程序猿界最不要臉的話"這次最後一次改動了",然後後面又要改,哎,你的人格算是掃地了。 。 。

如果有這樣的煩惱存在,請看下面的文章,保證你以後再也不求運維了,想幹啥就幹啥。 。 。

那PHP實作偽靜態有多少種方法了?個人見解和統計奧,有四種方法

1、使用apache的URL重寫規則,這個大家都懂,在apache裡面配置, 這裡同學們都造,只列舉一段簡單的配置

RewriteEngine On
RewriteRule ^/test.html index.php?controller=index&action=test [L]

##2、使用PHP的pathinfo , 你是不是有看到有的網站這樣玩'www.xxx.com/index.php/c/index/a/test/id/100' , 當然要支持這種你需要把'php.ini' 中的參數


'cgi.fix_pathinfo' 設定為1。拿'www.xxx.com/index.php/c/index/a/test/id/100'來舉例


echo $_SERVER['PATH_INFO']; //輸出'/c /index/a/test/id/100'

到這,應該明白了吧,你再對這段進行解析,分配實際地址

3、使用404機制,一般情況下偽靜態都是實際上不存在的頁面,因此可以使用apache 404配置,但是有些問題,就是'post'類型的請求會被拋棄,導致你無法取得'$_POST',


#但是'$_GET'仍然可以取得, 假設此處404頁面為'404page.php', apache 設定如下:


ErrorDocument 404 /404page.php

#然後在' 404page.php'中嵌入如下程式碼

header("HTTP/1.1 200 OK"); //这里一定要有,不然状态就是404
$reqUrl = $_SERVER['REQUEST_URI']; // 请求地址
/**
* 从URL中解析参数
*/
function parseUrlParams($queryUrl)
{
$arr = explode('?', $queryUrl);
parse_str($arr[1], $param);
if($param)
{
foreach($param as $key => $value)
{
$_GET[$key] = $value;
}
}
}
parseUrlParams($reqUrl); // url解析参数
//然后你就可以使用 $reqUrl 根据自己的规则匹配不同的实际请求地址
if(preg_match('#^/test.html#is', $reqUrl, $matches))
{
include('index.php');
die();
}

4、方法3的改良型,方法3在apache內部機制相當於重定向了,導致post(get)傳遞的參數無法取得。分析上面的其實是找不到相關文件,那當伺服器找不到相關文件時,我們為它指定一個文件,不就OK了,它就不用跳轉了,這時POST之類都不會丟失。 apache 設定如下:


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule 。一段配置的大概意思是當請求的檔案或目錄無法找到時使用根目錄下的'index.php' 替代,那麼這時你就可以在'index.php'中取得相關參數並解析到實際請求位址

/**
* 获取当前请求的URI地址
*@param void
*@author painsOnline
*@return string URI
*/
function getReqUri()
{
return trim($_SERVER["REQUEST_URI"]);
}
$reqUri = getReqUri();
if(preg_match('/^\/test.html/isU', $reqUri))
{//解析请求地址
include 'test.php';
exit();
}
<?php 
//利用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  
}else die(&#39;Path:Nothing!&#39;); 
//就是这么简单了。~)  
?>

以上是php如何實現偽靜態的幾種方式總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn