CodeIgniter架構中關於URL(index.php)的那些事,codeigniter架構_PHP教程

來源:互聯網
上載者:User

CodeIgniter架構中關於URL(index.php)的那些事,codeigniter架構


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

(1)關於CodeIgniter

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

(2)CodeIgniter架設的網站URL

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

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

舉個例子說明: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去掉呢?這就是我想主要分享的地方。

在講如何去掉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.php

我在自己電腦上開發時使用的是Apache伺服器,因此不可避免地要先在Apache伺服器下解決這個問題。其實,文章開始時提到的CodeIgniter官方協助手冊裡面已經給了Apache下的解決辦法,卻沒有給出Nginx下的解決辦法。沒辦法,Apache伺服器據說市場佔有率已經超過60%,作為如此主流的伺服器,官方手冊還是有必要說明它的配置方法的。為了更加清晰一些,我再更加詳細地說明一下。

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

RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteCond $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; }}

具體的改動已經標註在上面的注釋中了,很簡單的一句重寫規則,我卻折騰了蠻久的時間。希望分享出來,協助大家少踩坑。就寫到這裡吧!


PHP CodeIgniter架構中怎擷取當前頁面的URL

//use url helper
$this->load->helper('url');
current_url = current_url();
 

怎刪除CodeIgniter架構中URL段裡面的indexphp,執行個體,手冊上的木看明白,自己寫了個dome測試也不對

CodeIgniter 是一個輕量級的,快速的,能產生非常乾淨而且是對搜尋引擎友好化的URL的PHPMVC架構,預設情況下,index.php 檔案將被包含在你的 URL 中 例如:example.com/index.php/news/article/my_article首先確保你的Apache伺服器支援支援 mod_rewrite,開啟mod_rewrite需要修改httpd.conf,去掉LoadModule rewrite_module modules/mod_rewrite.so前的#你可以很容易的通過 .htaccess 檔案來設定一些簡單的規則刪除它。下面是一個例子,使用“negative”方法將非指定內容進行重新導向:RewriteEngine onRewriteRule ^(.*)$ /index.php/$1 [L]如果你的項目不在根目錄請把上面這一句改為:RewriteRule ^(.*)$ index.php/$1 [L]然後將該檔案放在網站的根目錄在上面的例子中,可以實現任何非 index.php、images 和 robots.txt 的 HTTP 要求都被指向 index.php。注意根據你項目的位置修改檔案的配置。將AllowOverride設定為none可以完全禁止使用.htaccess檔案,注意將你Apache的設定檔AllowOverride設定成All
 

http://www.bkjia.com/PHPjc/880091.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/880091.htmlTechArticleCodeIgniter架構中關於URL(index.php)的那些事,codeigniter架構 最近,在做自己的個人網站時,採用了輕量級的php架構CodeIgniter。乍一看上去,代...

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.