![](/img/trans.png)
[英]Codeigniter 2: The requested URL was not found on this server (404) error. CI isn't routing the right way
[英]Codeigniter isn't routing right
我安裝了Apache for Windows。 我買了CodeIgniter Professional並下載了他們的源代碼。 它說我應該把它的.htaccess放在網站的根文件夾中,所以我做了。 我將基本URL設置為http://127.0.0.1/kids/ ,其中kids是網站的根文件夾。 它顯示主頁很好。 當我點擊鏈接時,它總是給出404錯誤。 它說,“在這台服務器上找不到請求的URL /index.php/welcome/cat/2。” 我在目錄中嘗試了幾種可能的.htaccess但沒有成功。 在.htaccess內,它指示:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|captcha|css|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
解釋為什么它根本不起作用? 我還檢查了configs.php,看起來也沒問題。 config ['index_page']設置為空白。 我刪除了.htaccess文件但仍然存在同樣的問題,除了它說“在此服務器上找不到請求的URL / kids / welcome / cat / 2”。
試圖讓它運轉起來浪費了幾個小時,我正在失去耐心。
以下是CodeIgniter Professional的說明:
“為了使CodeIgniter可以訪問這些文件夾,你還需要在你的網站的根文件夾中創建一個小的.htaccess文件。這就是.htaccess文件的樣子。它基本上包含所有文件和文件夾的指令可在網站上查看:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|captcha|css|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
如果您熟悉Apache中的mod_rewrite,您會注意到此規則表面上從任何目標的URL中刪除了index.php。 下面當你配置CodeIgniter(特別是config.php文件)時,你會明白為什么這是一個好主意。 如果你不熟悉Apache中的mod_rewrite,請不要被這個文件嚇到太多。 基本上,.htaccess文件提出了一些規則,其中一個規則從所有URL中刪除了index.php。 文件中的其他規則允許使用您需要的各種其他文件夾(例如包含CSS,JavaScript,Captcha文件和圖像的文件夾)。“
我按照指示做了...把htaccess文件放在根文件夾中然后,它給出了404錯誤。 如果我從根文件夾中刪除htaccess文件,它會顯示主頁。 如果我添加htaccess文件,則會出現404錯誤。 我移動了htaccess,它沒有做任何重新路由。 顯然,Apache理解htaccess,否則它不會顯示404錯誤。
您的路線可能無法正確解決,但我不確定。 我建議采取以下步驟。
首先,我將不再使用PATH_INFO
作為CodeIgniter路由,因為它沒有必要。 將.htaccess
文件更改為:
RewriteEngine On
RewriteCond $0 !^(index\.php|images|captcha|css|js|robots\.txt)
RewriteRule ^.*$ index.php [L]
然后,在您的配置中,確保$config['uri_protocol']
設置為AUTO
(默認值,我相信)或REQUEST_URI
。
在此之后,最可能的原因是您的路由期望URL上有一個尾部斜杠。 我不太了解CodeIgniter知道特定設置的配置位置,但是您可以使用以下配置指令使您的URL具有尾部斜杠:
$config['url_suffix'] = "/";
編輯 :確保mod_rewrite
也正常工作。 在RewriteEngine
指令之后,在.htaccess
文件的頂部試試這個:
RewriteRule .* http://stackoverflow.com/ [L,R]
如果你被重定向到Stack Overflow,至少我們知道這是有效的。 如果沒有,您沒有收到500錯誤,因此問題出在.htaccess
文件中,在這種情況下,您應確認服務器配置中相應的<Directory>
條目,以確定您的站點位於磁盤上的位置AllowOverride All
設置。
編輯 :我應該更好地了解正斜杠,對不起。 出現此問題是因為mod_rewrite
在每個目錄( .htaccess
)上下文中的工作方式。
重寫URL后,將檢查它以確定mod_rewrite
應該對其執行的操作。 當您的URL指向本地資源並包含前導斜杠時, mod_rewrite
將其mod_rewrite
原樣。 如果沒有,則添加每個目錄前綴。
當它保持/index.php
,在這種情況下,內部重定向到/index.php
被假定為來自主機(localhost)的完全限定URL。 因此,請求的資源最終為http://localhost/index.php
。 添加每個目錄前綴時,重寫引擎中的后續步驟會嘗試從路徑中刪除DocumentRoot
(如果存在)。 這使我們留下了/kids/index.php
,然后將其傳遞給內部重定向,並按預期解析。
嘗試這個:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ /index.php/$1 [NC,L]
把它放在index.php所在的kids文件夾中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.