Các tuyến của tôi đang trả về 404, Làm cách nào để khắc phục chúng?


81

Tôi vừa mới bắt đầu tìm hiểu khung công tác Laravel và tôi đang gặp sự cố với việc định tuyến.

Tuyến đường duy nhất đang hoạt động là tuyến nhà mặc định được gắn với Laravel.

Tôi đang sử dụng WAMP trên Windows và nó sử dụng PHP 5.4.3 và Apache 2.2.22, đồng thời tôi cũng đã bật mod_rewrite và đã xóa 'index.php' khỏi tệp cấu hình application.php để lại một chuỗi trống.

Tôi đã tạo một bộ điều khiển mới có tên là Người dùng :

class User_Controller extends Base_Controller {

    public $restful = true;

    public function get_index() 
    {
        return View::make('user.index');
    }
}

Tôi đã tạo một tệp chế độ xem trong application / views / user / được gọi là index.php với một số mã HTML cơ bản và trong route.php, tôi đã thêm những điều sau:

Route::get('/', function () {
    return View::make('home.index');
});

Route::get('user', function () {
    return View::make('user.index');
});

Tuyến đầu tiên hoạt động tốt khi truy cập root ( http://localhost/mysite/public) trong trình duyệt web của tôi, nhưng khi tôi cố gắng truy cập tuyến thứ hai với http://localhost/mysite/public/usertôi thì gặp lỗi 404 Not Found. Tại sao điều này sẽ xảy ra?


.Htaccess không được sửa đổi, giống như khi nó mới ra khỏi hộp.
JasonMortonNZ

Có vẻ như WAMP là vấn đề. Đã thay đổi thành XAMPP ngay bây giờ và mọi thứ hoạt động tốt và đúng như vậy. Tôi có nên tự trả lời câu hỏi này giải thích rằng WAMP là vấn đề không?
JasonMortonNZ

@AquilaSolutions Có, bạn có thể. Vì vậy, mọi người sẽ thấy rõ ràng vấn đề của bạn đã được giải quyết ngay bây giờ.
Jocelyn

Câu trả lời:


25

Thay vào đó, bạn đã thử thêm cái này vào tệp tuyến đường của mình Route::get('user', "user@index")chưa?

Các đoạn văn bản trước @, usertrong trường hợp này, sẽ chỉ đạo việc trang với bộ điều khiển người dùng và các đoạn văn bản sau @, indexsẽ chỉ đạo các kịch bản để các userchức năng public function get_index().

Tôi thấy bạn đang sử dụng $restful, trong trường hợp này bạn có thể thiết lập của bạn Routeđể Route::any('user', 'user@index'). Điều này sẽ xử lý cả hai POSTGET, thay vì viết cả hai ra riêng biệt.


Tôi thay đổi từ WAMP sang XAMPP vì sự cố vẫn còn. Sau khi bắt đầu một dự án mới trên máy chủ XAMPP và sử dụng ký hiệu '@' thay vì '.' nó đang hoạt động tốt.
JasonMortonNZ

1
Nó hoạt động tốt với WAMP, bạn chỉ cần bật rewrite_module. Xem bình luận của @ Muvera bên dưới.
ajon

3
Tôi biết đây là một câu trả lời cũ, nhưng tôi đã gặp vấn đề tương tự: một tuyến đường mới đã được thêm vào và không hoạt động! (404). Tôi chỉ cần xóa các tuyến đường được lưu trong bộ nhớ cache! sử dụng tuyến đường nghệ nhân php: rõ ràng
trainoasis

118

Trên cài đặt LAMP Ubuntu của tôi, tôi đã giải quyết vấn đề này bằng 2 thay đổi sau.

  1. Kích hoạt tính năng mod_rewrite trên máy chủ apache: sudo a2enmod rewrite.
  2. Chỉnh sửa /etc/apache2/apache2.conf , thay đổi chỉ thị "AllowOverride" cho thư mục / var / www (là thư mục gốc tài liệu chính của tôi):AllowOverride All

Sau đó khởi động lại máy chủ Apache: service apache2 restart


Điều này đã khắc phục sự cố này cho tôi trên một máy vagrant được tải xuống từ Puphpet.
winkbrace

5
Cảm ơn, bạn là người tiết kiệm cuộc sống.
Hassan Murtaza

3
Cảm ơn rất nhiều, tôi đã lãng phí 4 giờ của tôi để tìm thấy điều này
Anshul Mishra

Đã làm việc cho tôi trên MacOS High Sierra 10.13.3 với Laravel-5.4
Yevgeniy Afanasyev

2
@McSonk, có lẽ câu hỏi dành cho windows. Giải pháp thay thế này hoạt động cho Ubuntu. Cảm ơn anh bạn.
Fendi Septiawan

63

Sử dụng WAMP, nhấp vào biểu tượng wamp -> apache-> apache modules-> cuộn và kiểm tra rewrite_module Khởi động lại LoadModule rewrite_module

Lưu ý, ứng dụng máy chủ tự động khởi động lại cho bạn sau khi bạn bật "rewrite_module"


CẢM ƠN RẤT NHIỀU, tôi đã cố gắng giải quyết vấn đề này từ hôm qua
Moe

2
Điều này dường như xảy ra với tôi mỗi khi tôi cài đặt / cài đặt lại WAMP và Laravel trên máy tính. Đây luôn là vấn đề. Hy vọng rằng nó sẽ cuối cùng được cam kết vào bộ nhớ;)
Kenmore

Trong Ubuntu 14.04, 'sudo a2enmod rewrite' và sau đó 'sudo service apache2 restart' hoạt động.
nspo

cho các hệ thống Linux cho phép mô-đun viết lại sudo a2enmod rewritesau khi khởi động lại mà sudo service apache2 restart
aimme

35

Bạn đã thử kiểm tra xem

http://localhost/mysite/public/index.php/user 

đã làm việc? Nếu vậy, hãy đảm bảo rằng tất cả các thư mục trên đường dẫn của bạn không có bất kỳ chữ cái viết hoa nào. Tôi đã gặp trường hợp tương tự và việc chuyển đổi các chữ cái thành chữ thường đã giúp ích.


Cảm ơn. Tôi đang xem qua từng bước cuốn sách Laravel (Laravel Starter) và bị mắc kẹt với việc định tuyến để đóng (trang 13). Điều này đã giải quyết vấn đề đó cho tôi.
Steve Lindsey

Điều này đã giải quyết vấn đề của tôi. Tôi có .htaccess trong thư mục gốc của thư mục apache đã phá vỡ htaccess của laravel.
Maarten00

Điều này đã giải quyết vấn đề khác mà tôi đã có. Sử dụng Laravel để tạo các trang và Angular để gọi REST, trên Windows thì lệnh gọi api/brancheshoạt động, nhưng trên linux, tôi phải thay đổi url này như: index.php/api/branchesCó cách nào để giải quyết điều này để có các url giống nhau không?
miroslavign

Tôi chưa bao giờ nghĩ nó phân biệt chữ hoa chữ thường
ClearBoth

thay vì đặt tập tin .htaccess từ / Public Folder vào thư mục gốc của dự án, sau đó bạn có thể truy cập bằng cáchhttp://localhost/mysite/user
Rohan Khude

9

Tôi gặp sự cố tương tự khi sử dụng EasyPHP. Tìm thấy rằng tôi đã phải chỉ định AllowOverride Alltrong <Directory>khối của tôi trong httpd.conf. Nếu không có điều này, Apache đôi khi bỏ qua của bạn .htaccess.

Của tôi cuối cùng trông như thế này ...

<Directory "D:/Dev">
    Options FollowSymLinks Indexes
    #### NEXT IS THE CRUCIAL LINE ####
    AllowOverride All                  
    Order deny,allow
    Allow from 127.0.0.1
    Deny from all
    Require all granted     
</Directory>

Tôi tìm thấy trên Debian GNU / Linux 7.6, phản hồi này cung cấp một phần những gì được yêu cầu, ngoài việc kích hoạt mô-đun cho apache2 (a2enmod rewrite).
Kevin Buchs

6

Bạn có thể cố gắng chuyển root/public/.htaccessđến root/.htaccessvà nó sẽ hoạt động


4
Bạn đã đăng cùng một câu trả lời cho 8 câu hỏi. Nếu bạn cho rằng chúng là trùng lặp, bạn nên đánh dấu chúng như vậy và không đăng câu trả lời cho từng cái.
Jaap

5

Các tuyến đường

Sử dụng chúng để xác định các tuyến đường cụ thể không được quản lý bởi bộ điều khiển.

Bộ điều khiển

Sử dụng chúng khi bạn muốn sử dụng kiến ​​trúc MVC truyền thống

Giải pháp cho vấn đề của bạn

Bạn không đăng ký bộ điều khiển dưới dạng các tuyến trừ khi bạn muốn một tuyến cụ thể 'được đặt tên' cho một hành động của bộ điều khiển.

Thay vì tạo một lộ trình cho các hành động của bộ điều khiển, chỉ cần đăng ký bộ điều khiển của bạn:

Route::controller('user');

Bây giờ bộ điều khiển của bạn đã được đăng ký, bạn có thể điều hướng đến http://localhost/mysite/public/uservà thiết bị của bạn get_indexsẽ được chạy.

Bạn cũng có thể đăng ký tất cả các bộ điều khiển trong một lần:

Route::controller(Controller::detect());

3

Đừng quên dấu " RewriteBase" trong public/.htaccess:

Ví dụ :

Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public

bạn đặt cái này ở đâu trong hồ sơ?
Goddard

3

Được rồi, vậy là sau khi vùi đầu vào vấn đề này trong hơn một ngày ... tôi đã đứng dậy và làm những gì tôi NÊN LÀM hôm qua, và GỬI TỚI những gì đang xảy ra!

Những gì Laravel đang THỬ làm ở đây, là chèn tệp index.phpngay trước đường dẫn được cho dưới dạng Lộ trình. VẬY, ví dụ: nếu bạn chỉ định a Route::get('/account/create', ...,và thực thi ứng dụng của mình từ say localhost/laravel/authenticate/public/account/createtrên trình duyệt của bạn, thì laravel muốn thực thi localhost/authenticate/public/index.php/account/create, nhưng để làm điều đó .... Apache cần phải xem các yêu cầu đó thông qua /wamp/www/laravel/laravel/authentication/public(đường dẫn của bạn có thể thay đổi đôi chút, tùy thuộc vào vị trí của bạn ứng dụng laravel thực sự đã được cài đặt, nhưng cuối cùng publiclà nơi cần phải thay thế) phải có 'Quy tắc viết lại' được áp dụng.

Rất may, laravel cung cấp quy tắc Viết lại chính xác trong một .htaccesstệp tiện dụng ngay trong publicthư mục ứng dụng của bạn . VẤN ĐỀ là, mã trong tệp '.htaccess' đó sẽ không hoạt động với cách WAMP được cấu hình bên ngoài. Lý do khiến SEEMS này là vấn đề được đề xuất bởi muvera ở đầu chuỗi này - mã rewrite_module cần được Apache tải trước khi RewriteRulenội dung hoạt động. Heck điều này có ý nghĩa.

Phần KHÔNG có ý nghĩa: đơn giản stoppingrestartingcác dịch vụ Apache sẽ không nhận các thay đổi cần thiết để WAMP thực hiện đúng với Quy tắc viết lại của bạn - Tôi biết, tôi đã thử điều này nhiều lần!

LÀM VIỆC GÌ: thực hiện các thay đổi do muvera đề xuất (xem đầu trang) để tải đúng mô-đun. Sau đó, thiết lập lại toàn bộ phiên Windows của bạn, do đó kết xuất Apache ra khỏi bộ nhớ hoàn toàn. Khởi động lại (tải lại) WAMP và VOILA! bản sửa lỗi hoạt động, Quy tắc RewriteRule chính xác được áp dụng, yada, yada; Tôi đang sống hạnh phúc mãi mãi.

Tin tốt lành ra khỏi tất cả điều này: Tôi biết rất nhiều về hơn .htaccess, RewriteRulehttpd.confcác file bây giờ. Có một đối số (hiệu suất) tốt để di chuyển logic từ public .htaccesstệp ứng dụng của bạn và đặt nó vào một Directory ...phần của httpd.conf trong thư mục Apache 'bin' BTW (đặc biệt nếu bạn có quyền truy cập vào thư mục đó).


0

Thử bật các thẻ php ngắn trong php.ini của bạn. WAMP thường tắt chúng và laravel cần chúng bật lại.


Chờ đã, cái gì? Laravel cần thẻ ngắn?
giám mục

0
Route::get('/', function()
{
return View::make('home.index');
});

Route::get('user', function()
{
return View::make('user.index');
});

thay đổi ở trên thành

Route::get('user', function()
{
return View::make('user.index');
});

Route::get('/', function()
{
return View::make('home.index');
});

Bạn phải sử dụng '/' (home / default) ở cuối tuyến đường của mình


0

bạn phải sử dụng Laravel 5 lệnh

  class User_Controller extends Controller {
  public $restful = true;
  public function get_index(){
  return View('user.index');
  }
  }

và trong các route.php

  Route::get('/', function()
  {
  return view('home.index');
  });

  Route::get('user', function()
  {
  return view('user.index');
  });

Thay đổi lệnh Laravel 5 cho chế độ xem và bộ điều khiển xem tài liệu tôi đã gặp lỗi tương tự trước đây


0

Chỉ cần chạy trong thiết bị đầu cuối của bạn.

 composer dump-autoload

0

Tôi nghĩ rằng bạn đã xóa tệp .htaccess mặc định bên trong thư mục công khai laravel. tải lên tệp nó sẽ khắc phục sự cố của bạn.



0

Nếu bạn đang sử dụng Vagrant thông qua Homestead, có thể đã xảy ra lỗi khi gắn thư mục được chia sẻ. Có vẻ như Vagrant lấy các tệp của bạn từ thư mục đó và hoán đổi các tệp thực sự có trên máy chủ khi khởi động, vì vậy nếu có lỗi, về cơ bản bạn đang cố gắng truy cập cài đặt Laravel của mình từ khi bạn tạo nó lần đầu tiên (mà là lý do tại sao bạn chỉ nhận được "nhà" - được tạo ra trong quá trình cài đặt).

Bạn có thể dễ dàng kiểm tra điều này bằng cách sshing vào vm của mình và kiểm tra tệp route / web.php để xem nó có thực sự là tệp của bạn hay không. Nếu nó không phải là, thoát ra và vagrant halt, vagrant upvà nhìn xem có lỗi khi khởi động.


0
  1. thiết lập tệp .env
  2. cấu hình index.html
  3. chắc chắn rằng bạn có .htaccess
  4. sudo service apache2 restart

hầu hết có thể là do sự cố bộ nhớ cache


0

Vấn đề chính của tuyến đường không hoạt động là có mô-đun mod_rewrite.so trong macos, linux không được kích hoạt trong tệp httpd.conf của cấu hình apache, do đó, .htaccess có thể hoạt động. tôi đã giải quyết vấn đề này bằng cách bỏ ghi chú dòng:

# LoadModule rewrite_module libexec/apache2/mod_rewrite.so

Xóa #khỏi dòng trên của httpdf.conf. Sau đó, nó sẽ hoạt động.
thưởng thức!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.