URL_PATHINFO_DEPR, depr表示 網頁路徑"分隔符",用"-", 有利于seo,注意是從 sername/index.php(開始的)/home-user-login-var-value開始的,pathinfo也支持普通的參數傳值(僅僅支持參數...). 在thinkphp中,有兩個地方使用depr,另一個就是tpl的文件目錄組織分隔符: 'TMPL_FILE_DEPR'=>'-'
URL_PATHINFO: 意思是路徑信息,意思是 網頁的url地址就表明了 網頁的模塊/控制器/操作等信息, 即path indicates info of the page.
'TAGLIB_BEGIN' => '<' 如果修改為[, 則擴展標簽(也叫xml標簽)的調用就是 [volist....]... [/volist], xml標簽定界符 不能跟基本標簽符號如{,相沖突...否則會引起解析錯誤.
如何生成tp3.2.3的多個模塊?
- 可以用手動創建類似Home模塊的Admin模塊目錄
- 用
define('BIND_MODULE' => 'Admin');
將index.php入口文件綁定到Admin模塊,由于Admin模塊不存在,所以第一次訪問localhost時會自動創建 Admin模塊的目錄. - 以后要注釋掉 BIND_MODULE 模塊, 恢復默認的入口為Home模塊..., 以后使用Admin模塊就如同Home模塊一樣的方法使用了...
標簽庫的配置,TAGLIB_PRE_LOAD => "cx,custom"
和TAGLIB_BUILT_IN=>"cx,custom"
是兩個不同的配置,前者主要是 用于外在的 自定義的 自己創建的標簽庫在tp啟動時就載入,適用于外在標簽在多個模板大量使用的場合,不必在 模板頁面再用<taglib name="custom"> 注意,所有的標簽都是小寫的
載入;后者是指在使用標簽時不必在前面加上標簽庫名稱,如<custom:great name="uid" value="1">...</custom:great>, 如果定義了custom為內置標簽,則直接寫<great name="uid" value="1">....</great>
在tp中,在模板html文件中,凡是可以使用普通變量如 {$name} 的地方,都可以使用系統變量,{$_Get["name"]},{$Think.config.name},而且可以使用函數...
在xml標簽中,注意區分 "變量" 和 "變量名稱"的區別, 變量是要加$,而變量名稱 則不加$. 通常像 <volist name="user" id="vo">....</volist>
中的name屬性使用的是變量名稱, 在value屬性中要使用變量,則要加上$. 同時在標簽外面的,純粹的普通變量的輸出要加$: {$name}
volist和foreach?
volist 中的vo可以認為是, vector output,(數組/矢量輸出) 也可以認為是數組/矢量 對象vector object. volist就是矢量對象列表. volist主要是用于數據表查詢結果或二維數組的輸出, foreach主要用于對象或數組的輸出. volist的屬性主要有name, id, offset-length(用于部分輸出),mod. 而foreach的屬性有name,item ,key
volist的mod?
它是一個屬性,也可以認為是一個賦值, <volist ... mod="2,5,x"> 等價于 <volist name="result" id="vo" key="i"> ...<assign name="mod" value="$i mod x"> mod="2" 實際上是 mod="key % 2"
但是你不能單獨的去賦值mod, 要在volist循環中賦值,所以就直接 寫在volist的屬性中了, 通常要把olist mod="x" 和 eq name="mod" value="1""2""..." 結合起來使用.
通常寫volist的 id就直接寫成 vo, 這是約定 習慣:<volist name="result" id="vo">
對tp標簽庫的理解,不管有多復雜, 就是把它理解為 解釋擴展的 <?php .... ?>
代碼. 解析后的代碼實際上是一個 php和html混合的頁面. 擴展的xml標簽是為了在 html中不只是 "肯定的,不變的"輸出 模板變量, 而且還要實現如同 php/js等代碼程序中的 條件語句if, switch, 和循環語句for foreach volist等, 用"純粹的html標簽式的頁面" 來代替html和php的混合頁面.
compare標簽和eq等標簽, range標簽和between等標簽?
eq, gt等比較標簽,是compare標簽的別名, 都有name, value屬性,只是compare標簽多了一個type屬性來指明是eq, gt,lt(less than)等.注意, 比較標簽和范圍標簽其實都是 條件標簽 if,都要解析為if條件語句... 只是比if標簽更簡潔.
tp中的模板標簽和 html標簽 的用法不同!! html標簽是不允許 在標簽名 中 嵌套的, 如:<p <span> span text</span>> para text </p>
的寫法是錯誤的, 但是tp中的 模板標簽, 由于要解析成php代碼, 所以 在 一個標簽的名稱中, 在標簽的屬性中, 是可以"嵌套" 其他tp標簽的, 如: <tr <eq id="uid" value="1">style="background-color:#eee"</eq>> ....<td>....</td> </tr>
php中的empty和isset的區別?
empty是判斷是否為空,而isset是判斷該變量或數組的元素是否設置,
通常, 如果 $var=0,false,null,'', 則empty($var)====true
對于isseet來說, 跟上面的一樣,當 $var=0,false,''時, 則isset($var)=true,只有一個, 當$var=null的時候, isset($var)===false.
數組和對象的寫法區別?數組的寫法是 $arr['key'], 對象的寫法則是用冒號表示: $obj:member, 而要自動識別時,則用點號 $some.member, 但是,在能夠確定時,最好是寫明確些
import和vendor函數的區別?
它們其實都是在內部調用的 require, 只是開始的部分做了些調整, 如果是ThinkPHP下的 Library/Think(或者core)下的類都是可以直接使用 , 如果是 Library下的Org,則用import來引入類, 如果是Vendor下的類,要引入, 則用vendor函數, 他們的區別, 只是針對的路徑不同.
通常自己寫的類/類庫,或引入的 按tp的規則 寫的其他人,開發團隊寫的 類庫, 都放在 Org目錄下, 使用import來引入; 如同在C++中一樣,如果是沒有按tp默認約定規則來寫的\放在vendor目錄下的類庫, 就用vendor方法來引用, 只是import和vendor的參數的默認值不同.
tp的show,display,直接echo的區別?
echo就是直接輸出內容,跟tp函數沒有毛關系; display和show都是View類的成員函數, 都有三個參數('tmpl對應文件','charset,doc-type),但是display要求要有對應的tmpl文件, 而show則不一定要有對應的tmpl文件, 可以直接輸出html內容...
php是解釋型語言, 解釋一句,再執行一句,所以前面有輸出,當后面有錯誤時,會終止運行,只是并不是直接翻譯成機器碼: 先將php源代碼轉換為opcode(如同在匯編語言中,nop是助記符, 0x90是opcode...,即計算機的中間代碼),然后由php的解釋引擎(php虛擬機,pvm): zend 來運行,也可以用jit技術在虛擬機上運行時編譯成機器碼來提高運行速度. 現在的語言,編譯和解釋的分別都不是那么嚴密了.
使用高版本的php, 功能更強大,
像__ROOT__, PUBLIC,...等都是在模板文件中,使用的, 不是在 控制器/方法|操作,中使用的, 而且是在 配置文件中的 TMPL_PARSE_STR' => array( '__PUBLIC' => ...,.....)
中定義的, 因為在默認情況下, ROOT, __PUBLIC__這些都是要被解析\替換的,所以如果確實要輸出 像ROOT, __PUBLIC__這樣的字符串, 則可以使用 另外的模板字符串定義 TMPL_PARSE_STR' => array( '--PUBLIC--' => '__PUBLIC__' ...,.....)
ThinkPHP的內置標簽庫在哪里?
內置標簽庫的基類是: \ThinkPHP\Library\Think\Template\TagLib.class.php, 內置的標簽庫cx(標簽庫的名稱都用小寫)在\ThinkPHP\Library\Think\Template\TagLib\Cx.class.php文件中.
C/C++為什么要使用指針分配對象?
Object myobj這種方式是自動分配,作用域在函數范圍內,當1. (使用指針會帶來兩個作用,也可以說是 兩個問題,看你是需要還是避免) 要延長對象的作用域和生命期, 并且要使用的是對象指向內存的本身, 而不是對象的拷貝; 2.要指向的對象本身分配的內存比較大,如果用對象的拷貝,耗費的內存比較大,可能溢出棧 時, 使用只能指針比較好, 具有RAII std::unique_ptr, std::shared_ptr, ...(這個比較少見)
因此, 如果只是要在文件作用域內,進行 函數傳參時, 使用 對象的本身,但是不需要延長生命期的時候, 就不要使用 指針, 而是使用 引用 就可以了, 這樣就避免了指針的 "延長生命期"的 "副作用" . 當然還有其他需要使用指針的時候, 如多態的實現...
php中的對象, 因為都是用new來實例化的,所以都用 ->(叫對象運算符)來引用(對象的成員變量,也叫屬性,字段,features), 靜態用::(叫雙冒號)來引用. 但是在tp的模板中使用冒號:來引用對象的成員.
后臺模塊 Admin 的配置參考 http://www.mamicode.com/info-detail-1181250.html
頁面trace是怎樣做到的過程?
定義'SHOW_PAGE_TRACE' => true,
模型類的定義問題? - 注意tp中的路徑問題, 很多路徑,都是 規定, 系統約定, 系統中的解析器, 會從約定的路徑開始解析...
自定義模型類, 要使用"相對路徑", 不用加 , 從模塊開始寫起:<?php namespace Home\Model; use Think\Model; class FooModel extends Model{...} ?>
而實例化自定義的模型類時, 要使用 "形式上的 絕對路徑" ,從 ?寫起:$User = new \Home\Model\FooModel();
數據庫的連接查詢?
目的是為了從多個表中獲取字段的信息,條件是兩個表 中要有相關聯的字段,字段的數據類型要相同,名稱不一定相同.
內連接的方式:
mysql默認的方式就是內連接,即join=inner join, 使用join要結合on使用, on是指明兩個表用 哪兩個字段 進行連接查詢; 不同于where,where是過濾 連接查詢結果 后的條件. 如果不使用join, 則使用 "隱含"內連接, 連接字段就放在where中(這時候的where就相當于on...).
mysql支持 中文下標key嗎? 是的:如{$vo["學號"]}
thinkphp中為什么要使用query函數?
如果是針對 單一的一個表, 的insert delete update select等操作, 就使用tp的 鏈接操作函數,
但是如果要操作的情況比這個復雜, 如查詢的表不是一個表,操作的是多個表, 或者是不是普通的Crud,而是聯合查詢,那么這個時候,就不能使用鏈式函數, 而要使用原生的sql語句,調用query函數了.如下:
$Sql= M();$query = "select foo.uid as '學號',foo.name,score.score from foo,score where foo.uid=score.sno and foo.name='john'";$query = "select foo.uid, foo.name, score.score from foo join score on foo.uid=score.sno where foo.name='john'";$result = $Sql->query($query);dump($result);
tp支持標準的orm和AR及原生的sql操作,為什么要寫這么多"眼花繚亂"的方法呢? 是因為在實際中的需求就有這么多,有的是功能的需求,有的是效率性能上的需求.
tp的"增刪改查"就是add, delete, save, select,跟原生的sql操作名稱不一樣,一是,不能去"占用""覆蓋"原生的操作名稱,二是正好與日常的"叫法"相一致.
$User=M('user')就是數據表對應的類的實例化對象,從oop的觀點來看,它本身就應該,也可以用來操作數據表的curd操作.
通常只有在add和save方法中,才需要創建數據對象DO, 調用`$User->create(); create($data);create($another_do); 也可以使用
data($data)方法`, 只有創建了do(在內存中),才能用add/save方法寫入數據庫
create和data創建do的區別?
create做的工作很多,包括了獲取ds,ds合法性檢驗,檢查字段映射, 字段驗證,自動完成,令牌檢查等. 而data則沒有那么多的附加工作和
功能,要自己去完成.
select子查詢的作用主要有四點?
1.用作生成子表(返回多條數據), 如 join (select....)as another_table...
2.用作生成一個靜態數值, 在算術表達式中使用
3.用作生成 "一個" "相關子查詢""動態子查詢" 數值, 用在 條件等 算數表達式中
4.用作生成數值范圍,用在exist,not exist語句中.
rand和mt_rand?
mt_rand比rand的速度更快(快4倍?),生成的隨機數更好? 在windows下, RAND_MAX的值是32768, 并且rand和mt_rand都不需要播種.
php中生成m,n之間的隨機數?
php生成隨機整數值,比aspx,java更簡潔,不需要去/100, 不需要去round,ceil等,直接用mt_rand(m, n)就得到了.
count(*)和count(column)的區別?
http://www.cnblogs.com/wzmenjoy/p/4244590.html count(column)不計 column為null的條數?
sum(參數), 如果參數是列名, 則表示整個列的數值的和, 如果是條件表達式,則是表示 列值滿足條件表達式 的記錄 行數的 總和
不能用count(條件表達式) 如count(score<60) 來統計不及格的總數, 因為 count(參數)中,只要參數 !=NULL 則都表示計算總的記錄條數. 所以,count(0)=count(1)=count(2)...=count(*)... 的

group by ,having等的用法:http://blog.csdn.net/zuiwuyuan/article/details/39431639
group: 意思是: 分組,聚合,組合,統計函數
having和where的區別?
where是對記錄進行原始條件過濾,在分組 group by語句前使用; where中不能使用聚合函數.
having是對分組后的結果,進行條件過濾, 在having中可以使用 聚合函數,也可以使用 一般過濾條件.
where score > max(score): error: invalid use of group function.?
這個問題就是,"為什么在 where 子句中 要使用where score > = (select avg(score) from table)' 而不是直接使用 where score> avg(score)', 上面已經做了回答: 因為在where字句中不能使用group function! 所以,要用子查詢...
mysql 為什么要使用group by 分組?
因為實際項目中, 有"需要分組, 按類別"進行數據查詢,統計的需求. 將"某列(某個字段)具有相同值的多條記錄合并為一組,最后作為一條記錄輸出", 注意這里是說 作為一條記錄輸出. 通常分組是和 聚合函數一起進行輸出的, 通常輸出的字段是 '分組字段1', '分組字段2...', '字段的聚合函數' from table group by '分組字段1', '分組字段2...'. 分組字段的選擇是關鍵,要選擇"某一列的值都相同的" 那個字段作為 "分組字段", 否則就失去了分組的意義,因為就沒有辦法分組.
(如果select語句中的 字段 沒有使用組函數,那么它就必須出現在group by字句中, 即作為分組字段,否則,就只會顯示第一條記錄 的那個 字段值). 也就是說, 如果group by 不跟聚合函數一起使用, select中不是使用的分組字段/group function,則就是沒有意義的分組,就是根本不懂分組的人.
mysql->php->browser的中文亂碼問題?
下面的說法是不正確的!!!
很簡單: 在mysql中不管,不要修改,保持為默認的utf-8; php就是連接的橋梁,是保證無亂碼的核心; browser不用手動去設置, 它的內容的編碼, 可以通過php的header函數來指定,來控制.
也就是說, 只要保證 *.php文件 要寫入到 mysql數據庫的文件編碼是 utf-8 就 一切ok
一是, 跟php文件的 編輯器/ide有關, 看editor能不能設置為utf-8編碼;
二是, 如果編輯器不能設置為utf-8編碼,就要用字符集轉換函數
php的 iconv和mb_convert_encoding?
兩者都不是php的原生函數庫函數, 要通過擴展開啟才能使用: php_icon.dll, php_mbstring.dll(可以通過phpinfo查看);
iconv的效率比mb_convert_encoding快, 只有當不知道原來的編碼,或iconv轉換出錯時,才使用后者;
iconv(in_charset, out_charset, str): out_charset//TRANSLIT(TRANSLATE + IT, 表示不能準確轉換時,轉換成一個近似的字符也可以),//IGNORE表示不能轉換時,忽略它.
iconv和mb_convert_encoding, 他們的參數都是一樣的, 但參數的方向正好相反. mb_convert_encoding(str, out_charset, [in_charset]最后這個"原來的字符編碼集"參數是可選的)...
php header的格式
header函數調用, 要放在方法函數中, 不能放在php標簽后,函數外部.header("字符串 Content-type: text/html; charset=utf-8 ");
mysql的查詢操作 "時間"概念?
通常,一個簡單的查詢操作, 費時: 0.000幾秒, 即萬分之幾秒, 多一點的操作 是 0.00幾秒, 即千分之幾秒.
php的類中的成員變量和成員方法 都要顯式的說明其 訪問類型, public,protected,private, 默認的,如果不寫訪問類型,則是public.
PHP_EOL: end of line
在mac中: \r, unix-like: \n, windows: \r\n. 只是換行符, 但是在html中仍然只是表現為一個空格, 不會換行.
控制器中的方法,總是 先輸出本方法中輸出的內容, 然后,(如果有this->display()的話), 再輸出對應的視圖頁的內容.
注意區別常量和"模板解析字符串"的區別?
因為這些常量和"convention"配置很容易混淆,所以要注意區別:
tp的常量包括: 預定義常量(如: THINK_VERSION,URL_COMMON...), 路徑常量(THINK_PATH,LIB_PATH,CORE_PATH)等,系統常量(APP,ROOT,MODULE,CONTROLLER,ACTION,SELF, IS_POST)等等(這些系統常量中, 分成兩種,有的只能用在PHP文件中,如: IS_POST,有的既可以用于php文件中,又可以用于View視圖的html頁面中, 如: URL之類的系統常量,SELF,MODULE,CONTROLLER,__ACTION__等, 而且這些變量可以用在html模板中的任意地方,既可以是地址之類的,如href,form的action,也可以直接在頁面內容中輸出...)
前面的常量, **只是限于系統已經定義了的(__PUBLIC__這個好像是已經定義了的, 好像不一定只是幫組手冊上所提到的那些), 如果沒有定義,你就不能在view視圖頁面內直接使用,要使用自己定義的模板變量進行地址替換, 就必須在配置文件的TMPL_PARSE_STRING中進行設置和規定.**
系統常量中的URL地址之類的東西,總是從根路徑 "/"開始輸出的(并且除了__ROOT__之外,其余都是帶index.php入口地址的), 如: ROOT:/, MODULE: /index.php/Home, CONTROLLER: /index.php/Home/Index, 而且通常URL地址類的系統常量,是不帶最后面的斜杠的,所以后面要接地址時,要自己加/
R函數是做什么的?
在同一個控制器內,調用方法時,可以直接使用 funcName(); 但是如果一個控制器的方法, 要調用另一個控制器的方法, 那么就要用R 函數了,支持從 R(module/controller/method)
A方法和R方法的區別?
都是跨"模塊/控制器"調用方法的, A方法是明確實例化一個控制器的對象,然后調用其中的方法$Con=A('Foo'); $Con->method1(); $Con->method2()..., 相當于$Con=new FooController()...
, 而R方法是每次都要實例化一個類的對象,R('Foo')->method1(); R('Foo')->method2(); 這個會生成兩個實例
. 因此,如果要使用其他模塊的多個方法,建議使用A方法.如果只使用其他模塊內的一個方法, 用R方法最簡潔.
U方法和"地址類系統變量"的區別?
"地址類系統變量" 只能使用本模塊/本控制器/本操作的方法, 如果要使用其他模塊或控制器的方法地址時,就 要使用U方法了. U方法可以通過在php操作中賦值然后assign的方式使用,也可以直接在模板中使用 {:U(oper)} 會一直生成完整 的路徑 /index.php/Home/Index/oper.html(很奇怪,這個也可以訪問,其實應該是重定向了?)
如何根據md5值反向 找到是哪個方法生成的cache?
這個是不可以的! 因為md5: message-digest algorithm 5,將任意長度的字符串,經過算法處理,轉換成128bit的整數,共32為16進制數字 md5是 哈希混淆,不可逆的, 也就是md5是不可解密的,將用戶的密碼經過md5加密后放入數據庫中, 即使是管理員也不能看到用戶的密碼,做到了地位平等 要暴力破解,也是用一些常用的字符串經過md5加密后,做成一個表,然后遍歷比較.密碼驗證的原理也是這樣的: 將輸入的密碼,md5轉換后,然后與數據庫中保存的相比較...
Application/Runtime/Cache/Home/緩存規則名稱??.php緩存文件名稱是怎么來的,如何知道它是哪個 html文件的緩存?
為什么thinkphp的 View/Controller_name/oper_name.html 的緩存竟然成了????.php文件呢? 因為tp的view下的模板文件中使用了 模板標簽,如{$varname}, {:U(....)}等, 所以經過緩存后,就成了<?php echo $varname} , echo U(...)...?>
的 php文件 tp手冊上有說明, 靜態緩存文件的 名稱 有 多種 規則,(當然絕對不是模板文件的名稱, 所以就不要用模板文件名去試探了...) 最后可能使用了md5函數
肯定的: convention.php中并沒有包含完全/所有的配置項, 如關于靜態緩存的配置 TMPL_CACHE_ON => true, TMPL_CACHE_TIME => 60秒...
**注意這里應該是TMPL,不是HTML. 有些所謂的手冊或文章是錯誤的!
part: n.部分,零件;v. 使分割,分開,分隔.
apart: a-part: 分開的;
partial: 部分的, 偏愛的, 鐘愛的 be partial to Chinese food.
impartial: 不偏不倚的,公平的,公正的,持平的 as an impartial observer, an impartial view.
partly:部分地
depart: de-(分開)-part(分隔): 分隔|分開| -> 離開 he departed from Beijing.
因此, thinkphp中的DEPR,就是分隔符,分割符的意思.包括: TMPL_FILE_DEPR, URL_PATHINFO_DEPR等.
thinkphp為什么能夠 全盤(在任何目錄或文件中都可以)應用那些 常量/變量/設置/類/函數?
- 所有的請求都被應用程序的入口文件index.php所攔截了
- 入口文件包含了ThinkPHP框架的入口文件 require ...ThinkPHP.php
在ThinkPHP.php, 首先定義了 (最基本的一些常量) 包括框架的const 預定義常量(const URL_COMMON=0 ... const EXT='.class.php' const THINK_VERSION = '3.2.3'...) , 路徑常量(THINK_PATH, LIB_PATH, CORE_PATH,....), 跟系統信息 有關的常量(IS_WIN, IS_CGI,IS_CLI) 還有一個 ROOT,是在ThinkPHP.php文件中定義的.
- 然后調用了 require CORE_PATH.'Think'.EXT
在Think.class.php是tp 整個底層框架的 引導類, 由它加載所有的底層架構,包括模型/視圖/緩存/日志/配置等等... 所以可以實現上面的目的...
6 最后引導應用程序啟動 Think\Think::start();
Thinkphp為什么能夠攔截所有請求, 實現單一入口?
由index.php來響應所有的http請求,來統一調度 :如同一棟房子中的多個房間只有一扇門,進入門之后, 再到哪個房間,則由 dispatch::dispatch() 來決定路由和哪個控制器和action,在dispatch中有 $_SERVER['HTTP_URI'],解析它就知道是哪個controller和action了. 這個 dispatch::dispatch() 里面就對url進行了分析, 結合 getController /Action/ Module 確定出了 ...
Runtime目錄是在App目錄下, 不是在模塊目錄下Home, 它是包括Cache, Data, Log等在內的,其中Cache下再分模塊Home等...
頁面布局: 按鈕元素靠兩邊, 內容占中間.
開發功能模塊的思路?
先要進行功能整理, 弄清該模塊(管理)包括哪些功能, 然后可以用兩種方式來組合實現: 一是模塊為目錄,每個功能為一個單獨的文件,這樣功能之間相互獨立,但是不利于代碼的共享; 二是,模塊定義為一個類文件,其中的功能定義為類中的方法...
有關/module/controller/action____的系統常量 是在: CORE_PATH/dispatch.class.php中定義的, dispatcher類就是完成 /module/controller/action對應的常量的定義, 以及解析pathinfo的路徑地址進行 路由和調度 ,將模塊/控制器/動作的形式 解釋調度到 對應的視圖html模板上去...
class dispatcher{ //這里是erstatic public function dispatch(){ // 這里沒有-er....define('__CONTROLLER__', __MODULE__.$depr.(defined(BIND_CONTROLLER) ? '' :($urlCase ? parse($controller) : $controller ));...}}
而__PUBLIC__, ROOT, __MODUEL__等在模板中的替換工作, 則是在 THINK_PATH/Behavior/ContentReplace.class.php中 的 入口函數 public function run(&$content)->templateContentReplace($content)中,作為$replace=array(..., 'PUBLIC' => ROOT."/Public"...); 來替換的...
static 和publi private等的位置關系?
static和public等位置可以顛倒. 說法是: 編譯的先后順序不同,但結果是一樣的; 靜態的公開成員和公開的靜態成員; 跟不同語言的編寫"約定"的風格有關,比如c++中就把public放在static的前面, php中就把static放在public的前面,遵循大多數人的/語言的默認風格就好. 在php中, 類都是public的 ,static是類層次的,public是成員層次的.php中大多數都是將static放在public的前面的,如: static public function dispatch(){...}
如何設置地址重寫?
地址重寫Rewrite跟 配置文件convention.php中的 URL_REWRITE=>2, 'URL_MODEL'=>1等都沒有關系,.htacess是分布式重寫控制, 可以實現服務器級別和目錄級別的重寫. 只要放在某個目錄下,那么這個目錄就可以自動 實現地址重寫,如果放在app的父目錄下,則整個項目都可以實現重寫. (原生的.htaccess實際上只是實現了隱藏index.php的功能)
要開啟Rewrite, 只要開啟apache的rewrite模塊功能就好了 在上面打勾就行.
Rewrite目的是為了 url跳轉和地址隱藏,可以實現 偽靜態, 域名跳轉,防止盜鏈.
<IfModule mod_rewrite.c>
Options +FollowSymLinks //這個是必須的,否則報錯: 500 服務器內部錯誤RewriteEngine On測試(Perl的 (類似linux的shell)正則表達式) 匹配條件, 依次有多條, 條件成立(測試匹配,如同if...)才執行下面的Rewrite substition// %{REQUEST_FILENAME}: htaccess/mod_rewrite定義的內部變量,表示請求的文件
// -d:表示前面的%{REQUEST_FILENAME}, 存在且是目錄 , -f表示 存在且為普通文件.
// !-d, !-f 就表示 要么不存在, 或者不是目錄或文件. (通常的情況是 表示 "不存在", 如果要訪問的地址存在,一般都是目錄/文件,則直接訪問,
// 因為不匹配測試條件,所以就不執行 rewrite rule了
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] RewriteRule ^(.*)$ http://other.example.com/$1 [參數/標記/附加說明]RewriteRule指令/語句的格式: RewriteRule Pattern Substitution [flags] 參考:http://blog.csdn.net/paulluo0739/article/details/17711851
QSA: qsappend, PT: passthrough(在應用多個模塊如mod_rewrite, mod_alias對地址進行重寫時使用),L: last.</IfModule>
配置文件convention.php中的'VAR_CONTROLLER'=>'c' ,就是用來在 $_GET['c']中獲取控制器的.