路由的設計與重寫(上)


    路由做爲網站設計的時候,很是關鍵的一環,通常了爲了對搜索引擎更加友好,須要直接將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>
相關文章
相關標籤/搜索