2016-04-29 71 views
0

我有一個簡單routes.php文件,看起來像這樣:Laravel 5條航線和mod_rewrite的

Route::group(['middleware' => 'cors', 'prefix' => 'api'], function() { 
    Route::post('users', 'Api\[email protected]'); 
    Route::get('users/{userId}/leagues/', 'Api\[email protected]'); 
}); 

一旦我把我的應用程序服務器,我不能得到任何執行的路線。我得到404例外。

我試圖通過將123置於文件的頂部,在routes.php文件中發生明顯錯誤。然後我點擊mydomain.com/users/1/leagues,我期待錯誤頁面,有一個語法錯誤,但沒有發生(仍然404)。 然而,增加這樣的事情時:

Route::get('/', function() { 
    return 'Hello'; 
}); 

,打回家的路線mydomain.com,我能看到第一個語法錯誤,然後將其固定後,Hello

我花了幾個小時才發現mod_rewrite沒有在遠程服務器上啓用。

有人可以提供更多的光線嗎? 爲什麼我的請求沒有達到routes.php(甚至沒有表明存在語法錯誤),而是返回了404頁面。爲什麼mod_rewrite使它工作? /怎樣才能達到route.php,但是/users沒有?

謝謝!

回答

1

當您向文檔根目錄(您的案例中的/)發出請求時,Apache將查找所謂的DirectoryIndex-這是進行此類請求時加載的默認文件。通常,此索引文件是index.php,index.html或由服務器配置或覆蓋文件(.htaccess)設置的任何一個。

在你的情況下,請求/將默認提供index.php - 這是Laravel的引導程序,並執行引導應用程序所需的初始步驟。其中一部分包括獲取路線並處理它們。

但是,當你請求/somethingmod_rewrite未啓用(或沒有被讀取您的.htaccess文件,因爲AllowOverride未設置爲All),Apache將不會試圖以服務DirectoryIndex,因爲它知道一個特定的請求被製造。由於/something不存在於您的文檔根目錄中,因此Apache將引發404錯誤。

所以,你需要確保mod_rewrite啓用(輸入sudo a2enmod rewrite到你的終端,或您的託管服務提供商說吧),並確保您的虛擬主機或默認的站點配置已設置AllowOverride All的文檔根目錄。

你也不妨試試以下方法:

FallbackResource /index.php 

這個指令依賴於mod_dir,而不是mod_rewrite退卻到index.php而不是拋出一個404這個模塊通常是默認啓用的。

+0

所以,如果我的理解正確,萬一'mod_rewrite'未啓用,apache將不會提供'index.php'和'bootstrap'路由。PHP'(當遇到不同的'/')?我需要閱讀更多關於mod_rewrite,謝謝你的答案。 – Ned

+1

確實。請記住'routes.php'與'mod_rewrite'無關。這裏的關鍵是'index.php',它只在請求'/'時纔會被提供。 –