1. 程式人生 > >Think PHP中URL_MODE相關事項

Think PHP中URL_MODE相關事項

有關 錯誤 模塊 override path 讀取 服務器 生效 正常的

官網上有關於URL_MODE的解釋:http://document.thinkphp.cn/manual_3_2.html#url

這裏主要講一下URL_MODE為2,即REWRITE模式。

REWRITE模式是在PATHINFO模式的基礎上添加了重寫規則的支持,可以去掉URL地址裏面的入口文件index.php,但是需要額外配置WEB服務器的重寫規則。

這裏可以看到,僅僅設置URL_MODE為2還不夠,由於是重寫,所以需要web服務器的重寫規則。以apache為例:

需要在入口文件的同級添加.htaccess文件,內容如下:

1 <IfModule mod_rewrite.c>
2 RewriteEngine on 3 RewriteCond %{REQUEST_FILENAME} !-d 4 RewriteCond %{REQUEST_FILENAME} !-f 5 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 6 </IfModule>

這只是添加了重寫的規則,具體註釋為:

#偽靜態和泛域名 
#此文件禁止在行內註釋
<IfModule mod_rewrite.c>
RewriteEngine on
 #禁止對圖片等文件重寫:沒有這一條,所有的404都會執行index.php腳本,耗費大量資源。
RewriteCond %{REQUEST_URI} !((.*).jpg|.jpeg|.bmp|.gif|.png|.js|.css)$
 #禁止對/public文件夾內重寫,作用同上
RewriteCond %{REQUEST_URI} !(^/public/(.*))$
#如果是一個物理存在的目錄,禁止重寫
RewriteCond %{REQUEST_FILENAME} !-d
#如果是一個物理存在的文件,禁止重寫
RewriteCond %{REQUEST_FILENAME} !-f
#上面2條不識別REQUEST_FILENAME時的替代寫法
#RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
#RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
#php api模式,服務器能識別PATH_INFO
#RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
#php fastcgi模式 服務器不識別PATH_INFO
RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L]
</IfModule>

在添加規則前要確保web服務器的重寫功能已經開啟,並確保服務器能讀取到.htaccess的配置,否則出現404錯誤。

apache重寫功能開啟:

在apache配置文件httpd.conf裏面將LoadModule rewrite_module modules/mod_rewrite.so註釋取消,這就開啟了apache的重寫支持。

Allow Override:

通常利用Apache的rewrite模塊對 URL 進行重寫的時候, rewrite規則會寫在 .htaccess 文件裏。但要使 apache 能夠正常的讀取.htaccess 文件的內容,就必須對.htaccess 所在目錄進行配置
AllowOverride參數就是指明Apache服務器是否去找.htacess文件作為配置文件,如果設置為none,那麽服務器將忽略.htacess文件,如果設置為All,那麽所有在.htaccess文件裏有的指令都將被重寫。對於AllowOverride,還可以對它指定如下一些能被重寫的指令類型.

Allow Override 設置為None的時候,會完全忽略.htaccess,設置為All的時候,會讀取所有的.htaccess配置。要保證rewrite正常,則至少要保證為FileInfo:

< Directory /myblogroot/> 
    AllowOverride FileInfo 
< /Directory> 

以上幾點全部做到後,URL_MODE=2才會生效,此時url裏面就可以不需要INDEX.PHP了。

Think PHP中URL_MODE相關事項