入口文件是應用的惟一入口,由於能夠多入口,每一個應用能夠對應一個入口文件,系統會從rul參數中解析當前請求的模塊,控制器,操做。ThinkPHP是區分大小寫的,考慮到linux是區分大小寫的,因此在ThinkPHP中模塊,控制器,模型等都是區分大小寫的,而且使用駝峯命名規則。php
若是咱們直接訪問入口文件index.php,url中沒有給出模塊,控制器,操做,系統會默認訪問Home模塊下的Index控制器下的index操做,所以下面的兩種訪問方法獲得的結果是同樣的:linux
http://serverName/index.php
http://serverName/index.php/Home/Index/index
這種URL模式是PATHINFO模式,ThinkPHP支持四種url模式,列表以下:正則表達式
URL模式 URL_MODEL設置
普通模式 0
PATHINFO模式 1
REWRITE模式 2
兼容模式 3thinkphp
若是整個項目使用相同的url模式能夠在應用配置文件中設置url模式,若是不一樣的模塊設置不一樣的模式,能夠在模塊的配置文件中設置。前面一句"應用配置文件",是那個文件呢,是thinkphp\Application\Common\Conf\config.php這個嗎,後面的好理解,每個模塊對用一個config文件,Admin模塊對應的是thinkphp\Application\Admin\Conf\config.php,Home模塊對應的配置文件是thinkphp\Application\Home\Conf\config.php服務器
普通模式url
普通模式是使用傳統的get傳參來指定當前的模塊,控制,操做例如:http://servername/?m=home&c=user&a=login&var=value,經我實驗,即便把URL_MODEL設置成1,2,3仍是可使用這種get傳參的方式來發訪問,PATH_INFO變量放在thinkphp\ThinkPHP\Conf\convention.php文件裏,個人設置以下:
spa
圖13d
訪問界面以下:code
圖2server
修改模塊爲Home模塊訪問結果以下:
圖3
這個感受有點亂了,既然設置成3le,仍是可使用第一種模式呢?
PATH_INFO模式
PATHINFO模式是系統的默認URL模式,提供了最好的SEO支持,系統內部已經作了環境的兼容處理,因此可以支持大多數的主機環境。對應上面的URL模式,PATHINFO模式下面的URL訪問地址是: http://localhost/index.php/home/user/login/var/value/
還能夠修改參數的分分隔符,例如我如今配置以下:
圖4
如今可使用下滑下劃線來區分參數了,以下:
圖5
REWRITE模式
REWRITE模式是在PATHINFO模式的基礎上添加了重寫規則的支持,能夠去掉URL地址裏面的入口文件index.php,可是須要額外配置WEB服務器的重寫規則。若是是Apache則須要在入口文件的同級添加.htaccess文件,內容以下:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
接下來,就能夠用下面的URL地址訪問了: http://localhost/home/user/login/var/value
兼容模式
兼容模式是用於不支持PATHINFO的特殊環境,URL地址是: http://localhost/?s=/home/user/login/var/value ,什麼狀況下不支持PATHINIFO?做者沒有提到
能夠更改兼容模式變量的名稱定義,例如:
'VAR_PATHINFO' => 'pathinfo'PATHINFO參數分隔符對兼容模式依然有效,例如:
// 更改PATHINFO參數分隔符'URL_PATHINFO_DEPR'=>'-', 使用以上配置的話,URL訪問地址能夠變成: http://localhost/?s=/home-user-login-var-value
兼容模式配合Web服務器重寫規則的定義,能夠達到和REWRITE模式同樣的URL效果。
例如,咱們在Apache下面的話,.htaccess文件改爲以下內容:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L] </IfModule>
這個和上面的REWRITE相似只有最後一句不一樣,一個是RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L],一個是RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L],討厭的正則表達式!不懂
就能夠和REWRITE模式同樣訪問下面的URL地址訪問了: http://localhost/home/user/login/var/value