路由做爲網站設計的時候,很是關鍵的一環,通常了爲了對搜索引擎更加友好,須要直接將index.php?a=1&b=2這種進行路由轉換。這裏先從最簡單的$_SERVER開始,對網站路由進行解析。示例:
http://127.0.0.1/index.php/dede/deafa/?s=/Admin/Index/index.html
PHP里路由識別的倆個關鍵性參數
$_SERVER['PATH_INFO'] 獲取腳本後面,查詢字符串前面的字符串
$_SERVER['QUERY_STRING'] 獲取查詢字符串
若是以示例代碼進行演示獲得的結果分別是:
$_SERVER['PATH_INFO']='/dede/deafa/'
$_SERVER['QUERY_STRING']='s=/Admin/Index/index.html'
其中query_string裏的參數是能夠直接經過get方式獲取到對應值的
$_GET['s'] 就能夠直接提取到/Admin/Index/index.html
由上面倆個參數,能夠獲得三種獲取路由控制器的思路:
1.一種比較簡單的思路,就是在單入口控制器裏直接用get方式傳遞,
直接將對應的模型和控制器還有action放入到對應的url裏,m,c,a
到了後臺直接$_GET['m'] $_GET['c'],$_GET['a']
直接用參數驅動的方式進行訪問
2.第二種思路是經過獲取$_SERVER['PATH_INFO']把控制器等方式
index.php/model/controller/action/這樣的路由形式
經過$_SERVER['PATH_INFO'] 獲取到/model/controller/action/這個字符串 trim($_SERVER['PATH_INFO'],"/") 獲取到
$arr = explde("/",trim($_SERVER['PATH_INFO'],"/"),4)
這樣$m=$arr[0];$c=$arr[1];$a=$arr[2],一樣獲取到了對應的訪問方式
而後(這裏有個比較經常使用的函數
$m=array_shift($arr);$c=array_shift($arr);$a=array_shift($arr)
可是不能搞錯順序,獲取$arr[0],同時移除 )
3.第三種思路經過將s=/Admin/Index/index.html的方式進行傳遞,獲取到了s的值後,將其轉移給$_SERVER['PATH_INFO']
而後一樣按照第二種方法的邏輯進行值的獲取。
雖然從路由的角度,php裏能夠設置一部分格式,可是須要將index.html轉換成實際訪問index.php文件,須要用到apache類的重寫規則(重寫規則是一個很是有用的功能) 這裏先以簡單的apache介紹怎麼將當url是index.html這種形式轉成訪問實際地址是index.php
主要操做有:
1.打開apache的http.conf文件,找到LoadModule rewrite_module modules/mod_rewrite.so 行,對其進行啓用
2.打開vhost
把AllowOverride None 將None改成 All
3.創建.htaccess文件(在網站的根目錄下面),寫入如下規則:
//加載重寫模塊
<IfModule mod_rewrite.c>
//重寫引擎開啓
RewriteEngine on
#檢測請求的文件名%{REQUEST_FILENAME}不是目錄或者文件就不匹配這#倆條規則
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
//沒有匹配到的全部文件所有重定向到index.php 同時結束這種匹配
RewriteRule ^(.*)$ index.php [L]
</IfModule>
4.重啓apache
這樣直接訪問index.html會訪問成index.php
簡單重寫規則代碼:
php
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>