簡體   English   中英

Codeigniter無法正確路由

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM