CodeIgniter框架中關於URL(index.php)的那些事

最近,在作本身的我的網站時,採用了輕量級的php框架CodeIgniter。乍一看上去,代碼清晰簡潔,MVC模型很是容易維護。開發時我採用的工具是Netbeans IDE 8.0,固然,本文的內容和開發工具是沒有關係的,和咱們最後網站採用的服務器有很大的關係。目前最爲經常使用的兩款免費web服務器是Apache和Nginx(這兩款服務器的比較,能夠參考一篇網上的經典文章:http://zyan.cc/nginx_php_v6/)。在我網站開發與上線的過程當中,恰好兩個服務器都用到了,他們配置CodeIgniter時稍有區別,接下來分別闡述一下,也爲了讓其餘開發者在使用CodeIgniter框架時少踩坑。javascript

 

(1)關於CodeIgniterphp

CodeIgniter是一款開源的超輕量級MVC框架,經常使用於快速地Web開發中,若是你願意,甚至能夠隨意地更改其中的源代碼,以適應本身的需求。這個框架自己不想多作介紹,須要熟悉的朋友能夠去CodeIgniter官方網站下載,而且官網也提供了很是詳細的中文幫助手冊,能夠很好的幫助新人學習。幫助手冊連接: http://codeigniter.org.cn/user_guide/toc.html 。幫助手冊中從0開始教你搭建一個簡單的網站。css

 

(2)CodeIgniter架設的網站URLhtml

最開始CodeIgniter搭建的網站URL是這樣子的:java

http://[網站網址]/index.php/[controller class name]/[class function name]/[function parameter]nginx

舉個例子說明:http://127.0.0.1/index.php/welcome/hello/zhangsan。這個例子中,假設了網站的網址是127.0.0.1,也就是咱們經常使用的本機地址,採用controller文件夾中的welcome.php這個用php編寫的類處理這個url請求,具體處理方法是調用這個welcome類裏面的hello函數,這個函數是須要一個參數的,咱們傳進去的參數是字符串zhangsan。不過有一點比較礙眼,就是url裏面包含了一個固定的字段index.php,看着很不爽。我想要的結果是這樣的:http://127.0.0.1/welcome/hello/zhangsan。那麼如何把index.php去掉呢?這就是我想主要分享的地方。web

 

在講如何去掉index.php以前,咱們先弄清楚它爲何會出如今這裏。對於任意一個url請求,CodeIgniter都是先由位於網站跟目錄下的index.php文件處理的,這個文件再根據你提供的url中index.php後面的部分來肯定把這個請求從新交給哪個類的哪個函數處理。所以,url中必須包含index.php這個字段,顯式的告訴服務器,這個url你先讓index.php去從新定向到我後面指定的類去處理。若是不通過任何配置就直接把index.php去掉,你的網頁是顯示不出來的。那麼咱們若是要去掉它,就是但願通過一些配置選項,讓服務器見到一個url默認地就用index.php去處理就行了,不用再把index.php顯示在url裏面。瀏覽器

 

(3)Apache服務器下去掉index.phpphp框架

我在本身電腦上開發時使用的是Apache服務器,所以不可避免地要先在Apache服務器下解決這個問題。其實,文章開始時提到的CodeIgniter官方幫助手冊裏面已經給了Apache下的解決辦法,卻沒有給出Nginx下的解決辦法。沒辦法,Apache服務器聽說市場佔有率已經超過60%,做爲如此主流的服務器,官方手冊仍是有必要說明它的配置方法的。爲了更加清晰一些,我再更加詳細地說明一下。服務器

 

在網站根目錄下(也就是與前文提到的index.php同一個目錄下),新建一個文件,名爲.htaccess。注意不要忘了htaccess前面還有個點。用記事本打開這個文件,寫入以下命令:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond $1 !^(index\.php|images|js|css|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

看一下英文單詞Rewrite也猜到了,其實這個文件控制的就是url的重寫規則。關於.htaccess文件的具體重寫規則和所有種類的語法又是一門大學問,在這裏就不詳述了。咱們只關心上面寫的這幾句話是啥意思。

第一句 RewriteEngine on:翻譯過來就是「重寫引擎 開啓」,至關於啓動url重寫機制。

第二句 RewriteCond %{REQUEST_FILENAME} !-f:翻譯過來就是「重寫條件 請求文件名不是個文件」。最後一個字母f理解爲file,!-f的感嘆號表示否認,也就表示不是個file。

第三句 RewriteCond %{REQUEST_FILENAME} !-d:翻譯過來就是「重寫條件 請求文件名不是個目錄」。最後一個字母d理解爲directory。

第二句與第三句的用途是說,只有在你的URL請求不是文件的名字或者文件夾名字的時候,才啓用重寫規則。舉例說明,好比http://127.0.0.1/test.html。這個請求其實就是在你的網站根目錄下尋找test.html,若是找到了,就直接返回這個文件便可,不用重寫;只有在根目錄找不到test.html時,才重寫這個url,這是REQUEST_FILENAME是個文件的例子。再好比http://127.0.0.1/nihao,這裏nihao頗有多是根目錄下的一個文件夾(固然也能夠是一個沒後綴的文件),這種狀況下先尋找根目錄有沒有nihao這個文件夾,沒有的話再啓用url重寫,這是REQUEST_FILENAME是個目錄的例子。

第四句 RewriteCond $1 !^(index\.php|images|js|css|robots\.txt):翻譯過來就是「重寫條件 url網址後的第一個參數不能夠是index.php,images, css, js, robots.txt任何一個」。好比 http://127.0.0.1/images/girl.png,這個url第一個參數是images,這種狀況下不要重寫,只有不是以上列出來的那些時才重寫。這句話目的是排除一些url請求的重寫,由於咱們常常會把網站的css文件,javascript文件,圖片文件放在根目錄下的css,js,images文件夾下,而後在網頁中經過url引用這些資源,若是請求這些資源的url也被重寫了,網頁中就引用不到了。你能夠根據本身的實際需求,新添加一些須要排除在外的重寫url的狀況。

第五句 RewriteRule ^(.*)$ /index.php/$1 [L]:翻譯過來就是「重寫規則 把url網址後第一個參數前面加上index.php」。[L]表示這是最後一條重寫規則,後面沒有了。

這樣,你若是在瀏覽器輸入http://127.0.0.1/hello/zhangsan,其實至關因而http://127.0.0.1/index.php/hello/zhangsan。

最後還有一個小坑,就是在使用工具開發網站的時候,每每咱們網站代碼並不在Apache服務器的根目錄下,好比咱們在Apache服務器的根目錄下又創建一個文件夾xxx,而且把網站整個放在這個文件夾裏面,那麼咱們的主頁地址就是http://127.0.0.1/xxx/index.php。這時必須把上面配置文件第五句話改成RewriteRule ^(.*) /xxx/index.php/$1 [L],還有一種改法是直接去掉第五句話中index.php前面的斜槓(即RewriteRule ^(.*)$ index.php/$1 [L]),這一點千萬注意!

 

完成了上面的.htaccess文件後,還有兩件事情要作。

第一,找到CodeIgniter中的application/config/config.php文件,把index_page設爲空值,即$config['index_page'] = '"";還有base_url設爲網站根目錄(index.php所在目錄),$config['base_url']="http://127.0.0.1/xxx/"。部署到真正服務器上使網站上線前,不要忘了把127.0.0.1改爲你網站的網址,若是index.php放在服務器根目錄,也記得把base_url裏這個xxx去掉。

第二,找到Apache的配置文件,也就是conf/httpd.conf這個文件,確保LoadModule rewrite_module modules/mod_rewrite.so前面的井號#已經去掉了。而後關鍵字搜索htaccess,找到配置.htaccess的部分,其設置應該改成AllowOverride All。其實若是你沒有用很舊版本的Apache,井號和AllowOverride All默認就應該是設置好了的。這一步只是確認一下,不是這麼配的要改爲這樣。

 

至此,Apache服務器下CodeIgniter的URL配置大功告成。如今index.php已經不須要出如今URL中了,系統會默認讓index.php先去處理URL。

 

(4)Nginx服務器下去掉index.php

上文中提到的Apache去掉index.php在官方幫助文檔也有簡要的說明,可是Nginx服務器就沒有這麼幸運了。我在網站開發時本地是Apache,可是網站上線時的服務器倒是Nginx的,所以不得已又去網上搜索Nginx服務器下的配置,折騰了好久,試錯試了不少次,總算把一個正確的版本試出來了,如今能夠提供給你們參考。由於本身對於Nginx的配置沒有深刻研究過,因此先說明一下本身線上服務器用的環境,而後再展現Nginx配置的修改內容。以我目前的配置,親測能夠很好地工做,你們碰到了相似的問題能夠按照個人配置嘗試一下,不過我也不敢保證在您的系統上必定會奏效……個人線上服務器是買的XX雲(避免廣告~)服務器(本身從零開始搞一個服務器實在太麻煩了),系統配置好以後默認就是Nginx。操做系統採用的是Ubuntu 12.04,Nginx版本是nginx/1.1.19。

 

看網上好多人的Nginx服務器默認配置文件是/etc/nginx/nginx.conf,個人也不例外。不過有個注意事項,有時候nginx.conf中會有一句include ***(另一個文件),也就是引用外邊某個文件的內容做爲配置文件,這時候,若是你沒有在nginx.conf中找到服務器server相關配置,不妨去它include的另一個文件中找一下,個人就是這種狀況。在個人配置文件中,和服務器有關的配置應該改爲以下:

server {
        listen   80;

        root /usr/share/nginx/www;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                index index.php index.html index.htm;
                
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules

                # 請留意下面這條重寫規則,和前面的Apache有些相似
                if (!-e $request_filename) { ##若是沒有找到目標文件
                        rewrite ^/(.*)$ /index.php/$1 last;
                        break;
                }
          
           
          # 上面的重寫規則也能夠改爲下面這種形式,親測二者均可行
          # if ($request_filename !~ (js|styles|images|robots\.txt|index\.php.*)){ ##若是不是請求js,styles等文件
          # rewrite ^/(.*)$ /index.php/$1 last;
          #
break;
          # } } location
/doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; deny all; } location ~ \.php($|/) { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } }

具體的改動已經標註在上面的註釋中了,很簡單的一句重寫規則,我卻折騰了蠻久的時間。但願分享出來,幫助你們少踩坑。就寫到這裏吧!

相關文章
相關標籤/搜索