現在用的版本是TP3.1.3,這兩天總是遇到NotFound的錯誤,解析路徑錯誤,所以認真研究了一下手冊,發現問題出在URL模式上面。
URL模式
一般是使用U方法來生成路徑,U方法的定義規則如下(方括號內參數根據實際應用決定):
U('[分組/模塊/操作]?參數' [,'參數','偽靜態后綴','是否跳轉','顯示域名'])
如果不定義項目和模塊的話 就表示當前項目和模塊名稱,下面是一些簡單的例子:
U('User/add') // 生成User模塊的add操作的URL地址
U('Blog/read?id=1') // 生成Blog模塊的read操作 並且id為1的URL地址
U('Admin/User/select') // 生成Admin分組的User模塊的select操作的URL地址
U方法的第二個參數支持數組和字符串兩種定義方式,如果只是字符串方式的參數可以在第一個參數中定義,例如:
U('Blog/cate',array('cate_id'=>1,'status'=>1)) U('Blog/cate','cate_id=1&status=1') U('Blog/cate?cate_id=1&status=1')
所以關鍵就在於視圖頁面使用的U方法是用哪種方式來傳遞參數的。不同的傳參方法,對應不同的URL_MODEL。相當於使用不同的傳參方法就要設置相對應的解析方式。
而URL_MODEL設置在手冊里寫的很清楚:
一、普通模式:設置URL_MODEL 為0
采用傳統的URL參數模式
http://serverName/appName/?m=module&a=action&id=1
二、PATHINFO模式(默認模式):設置URL_MODEL 為1
默認情況使用PATHINFO模式,ThinkPHP內置強大的PATHINFO支持,提供靈活和友好URL支持。PATHINFO模式自動識別模塊和操作,例如
http://serverName/appName/module/action/id/1/
或者
http://serverName/appName/module,action,id,1/
在不考慮路由的情況下,第一個參數會被解析成模塊名稱(如果啟用了分組的話,則依次往后遞推),第二個參數會被解析成操作,后面的參數是顯式傳遞的,而且必須成對出現,例如:
http://serverName/appName/module/action/year/2008/month/09/day/21/
其中參數之間的分割符號由URL_PATHINFO_DEPR參數設置,默認為”/”,例如我們設置URL_PATHINFO_DEPR為“-”的話,就可以使用下面的URL訪問
http://serverName/appName/module-action-id-1/
注意不要使用”:” 和”&”符號進行分割,該符號有特殊用途。
略加修改,就可以展示出富有詩意的URL,呵呵~
如果想要簡化URL的形式可以通過路由功能(后面會有描述)以及空模塊和空操作。
在PATH_INFO模式下面,會把相關參數轉換成GET變量,以及並入REQUEST變量,因此不妨礙URL里面的GET和REQUEST變量獲取。
三、REWRITE模式: 設置URL_MODEL 為2
該URL模式和PATHINFO模式功能一樣,除了可以不需要在URL里面寫入口文件,和可以定義.htaccess 文件外。在開啟了Apache的URL_REWRITE模塊后,就可以啟用REWRITE模式了,具體參考下面的URL重寫部分。
四、兼容模式: 設置URL_MODEL 為3
兼容模式是普通模式和PATHINFO模式的結合,並且可以讓應用在需要的時候直接切換到PATHINFO模式而不需要更改模板和程序,還可以和URL_WRITE模式整合。兼容模式URL可以支持任何的運行環境。
兼容模式的效果是:
http://serverName/appName/?s=/module/action/id/1/
並且也可以支持參數分割符號的定義,例如在URL_PATHINFO_DEPR為~的情況下,下面的URL有效:
http://serverName/appName/?s=module~action~id~1
其 實是利用了VAR_PATHINFO參數,用普通模式的實現模擬了PATHINFO的模式。但是兼容模式並不需要自己傳s變量,而是由系統自動完成URL 部分。正是由於這個特性,兼容模式可以和PATHINFO模式之間直接切換,而不需更改模板文件里面的URL地址連接。
某些服務器環境不能良好的支持PATHINFO,但是在大多數環境下面ThinkPHP可以進行兼容判斷,如果你的服務器環境或者空間仍然無法識別PAHTINFO的話,或者需要自己增加識別方法或者可以選擇普通模式或者兼容模式URL運行。
URL重寫
這里第三種模式在網站發布的時候時常會用到,為了使URL看起來更加清爽,所以需要開啟URL_MODEL=2,而這個模式和模式1沒有太大區別,但是需要對Apache服務器進行相應的配置。下面是官方手冊上的介紹:
通常的URL里面含有index.php,為了達到更好的SEO效果可能需要去掉URL里面的index.php ,通過URL重寫的方式可以達到這種效果,通常需要服務器開啟URL_REWRITE模塊才能支持。
下面是Apache的配置過程,可以參考下:
//--------------------------------------
1、httpd.conf配置文件中加載了mod_rewrite.so模塊
2、AllowOverride None 將None改為 All 注意:需要將所有出現的 "AllowOverride None" 中的 "None" 都改為 "All" ,不然是不行的
3、確保URL_MODEL設置為2
4、把下面的內容保存為.htaccess文件放到入口文件的同級目錄下
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
---------------------------------------//
重啟Apache之后,原來的
http://serverName/index.php/Blog/read/id/1
就可以通過訪問
http://serverName/Blog/read/id/1
簡化了URL地址。
在一般情況下,網站開發的時候可以只使用URL_MODEL=1這個模式,如果要使用URL路由,則應該配置URL_MODEL=2.這部分以后遇到再做研究。