Laravel là một framework hàng đầu cung cấp cú pháp đặc biệt. Đó là khuôn khổ ưa thích của nhiều nhà phát triển. Tuy nhiên, nếu bạn vừa triển khai dự án Laravel đầu tiên của mình trên một máy chủ lưu trữ được chia sẻ, thì cuối cùng bạn có thể gặp phải một sự cố cụ thể—các tuyến đường mới thêm của bạn có thể không hoạt động. Định tuyến Laravel không hoạt động trên máy chủ trực tiếp là một vấn đề chắc chắn cần được giải quyết nhanh nhất có thể để đảm bảo tất cả các trang web của bạn đều có sẵn công khai. Trong bài đăng này, chúng tôi sẽ cung cấp các giải pháp khả thi
Ghi chú
Laravel phải luôn được phục vụ từ thư mục gốc của "thư mục web" được định cấu hình cho máy chủ web của bạn. Không cố gắng phục vụ ứng dụng Laravel ra khỏi thư mục con của "thư mục web. " Làm như vậy có thể làm lộ các tệp nhạy cảm hiện có trong ứng dụng của bạn
Mục lục
Phương pháp 1. Xóa bộ đệm ẩn định tuyến
Khi bạn đang triển khai ứng dụng Laravel của mình để sản xuất, thông thường bạn nên tận dụng bộ đệm định tuyến của Laravel. Sử dụng bộ đệm tuyến đường giảm đáng kể lượng thời gian cần thiết để đăng ký tất cả các tuyến đường của ứng dụng của bạn. Để tạo bộ đệm tuyến đường, hãy thực hiện lệnh Artisan route:cache
php artisan route:cache
Sau khi chạy lệnh này, tệp tuyến đường được lưu trong bộ nhớ cache của bạn sẽ được tải theo mọi yêu cầu. Đây là thời điểm cần nhớ rằng nếu bạn thêm bất kỳ tuyến đường mới nào, bạn sẽ phải tạo bộ đệm tuyến đường mới. Đó là lý do để bạn chỉ chạy lệnh route:cache
trong quá trình triển khai dự án của mình
Nếu bạn gặp vấn đề về các tuyến đường mới không hoạt động, hãy thử sử dụng lệnh route:clear
để xóa bộ đệm tuyến đường
php artisan route:clear
Nếu cách đó không khắc phục được sự cố, hãy tiếp tục với phương pháp thứ hai
Các vị trí tệp index.php
và .htaccess
phải nằm trong cùng một thư mục. Bạn cần làm như sau
- Kiểm tra xem trang
index.php
của bạn nằm ở đâu; - Kiểm tra xem tệp
.htaccess
của bạn nằm ở đâu
Ghi chú
Vì là tệp ẩn [dấu chấm] nên .htaccess
thường bị lãng quên. Đây là một trong những trường hợp phổ biến nhất đối với nhiều vấn đề, một trong số đó là các tuyến Laravel không hoạt động bình thường trên máy chủ trực tiếp
Bạn cần tìm tệp .htaccess
. Bạn có thể thực hiện việc này bằng cách sử dụng Trình quản lý tệp cPanel hoặc ứng dụng khách FTP như FileZilla. Đối với ví dụ này, chúng tôi sẽ sử dụng Trình quản lý tệp.
Như chúng tôi đã đề cập, tệp .htaccess
theo mặc định. Vì vậy, nếu bạn không thấy nó trong Trình quản lý tệp, bạn cần vào Cài đặt → Hiển thị tệp ẩn → Lưu
Trong trường hợp bạn vẫn không thể tìm thấy tệp .htaccess
sau khi bạn đã hiển thị các tệp ẩn, điều đó có nghĩa là nó chưa được tạo. Bạn có thể tạo bất kỳ tệp nào bằng cách sử dụng tùy chọn Trình quản lý tệp + Tệp [Tệp mới] ở góc trên cùng bên trái. Trong trường hợp này, bạn cần một tệp .htaccess
Sau khi chắc chắn rằng các tệp index.php
và .htaccess
của bạn nằm trong cùng một thư mục, các định tuyến Laravel của bạn sẽ hoạt động bình thường trên máy chủ chia sẻ FastComet
Nếu phương pháp này không hoạt động, chúng tôi có tùy chọn thứ ba cho bạn
Phương pháp 3. Tạo một liên kết tượng trưng tới php artisan route:clear
7
Khi cả hai phương pháp đều không hiệu quả với bạn, bạn nên thử tạo một liên kết tượng trưng từ thư mục chung đến thư mục
php artisan route:clear7. Việc tạo liên kết tượng trưng nghe có vẻ phức tạp, nhưng sau khi thực hiện các bước chúng tôi cung cấp, bạn sẽ thấy rằng đó là cách khắc phục nhanh chóng. Đây là những gì bạn phải làm
- Đổi tên thư mục
php artisan route:clear
7 thànhln -s /home/user/laravel_project/public /home/user/public_html
0 hoặc tương tự. Bạn đang làm điều này để hủy kích hoạt thư mục thay vì xóa nó - Sử dụng SSH, thực hiện lệnh sau
ln -s /home/user/laravel_project/public /home/user/public_html
Trong đó
ln -s /home/user/laravel_project/public /home/user/public_html1 là tên người dùng của bạn và
ln -s /home/user/laravel_project/public /home/user/public_html2 là tên của thư mục chứa ứng dụng Laravel của bạn.
Liên hệ với chúng tôi để được hỗ trợ
Trong trường hợp không có phương pháp nào trong bài đăng này phù hợp với bạn, vui lòng liên hệ với các chuyên gia hỗ trợ kỹ thuật của chúng tôi thông qua một vé hỗ trợ. Họ sẽ trả lời bạn nhanh chóng và giúp bạn giải quyết vấn đề Laravel route không hoạt động trên shared hosting.
Nếu bạn có một dự án Laravel, bạn có thể ngạc nhiên khi thấy các route của mình có thể có sẵn trên một số URL khác nhau
Hãy tưởng tượng ví dụ sau từ tệp tuyến đường của bạn
This creates a route at
yourdomain.tld/feature/uptime-monitoring
, mà bạn mong đợi
But in most webserver configs, this means the following URLs are all valid and will all return an HTTP/1.1 200 OK
cùng trang
//ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
index.php
đó đang làm gì trong đó vậy?
Nhưng bạn có thể không cần/muốn nó, vì vậy hãy loại bỏ nó
Đang xóa chỉ mục. php từ bên trong mã Laravel của bạn
Một cách để loại bỏ nó là kiểm tra tuyến đường trong Laravel và chuyển hướng đến đó nếu cần
Đây là một cách để làm điều này trong
//ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
0removeIndexPhpFromUrl[];
}
protected function removeIndexPhpFromUrl[]
{
if [Str::contains[request[]->getRequestUri[], '/index.php/']] {
$url = str_replace['index.php/', '', request[]->getRequestUri[]];
if [strlen[$url] > 0] {
header["Location: $url", true, 301];
exit;
}
}
}
}
Điều này sẽ chuyển hướng bất kỳ URL nào có chỉ mục. php trong đó
$ curl -I "//ohdear.app.test/index.php/pricing"
HTTP/1.1 301 Moved Permanently
Location: /pricing
$ curl -i "//ohdear.app.test/index.php/feature/uptime-monitoring"
HTTP/1.1 301 Moved Permanently
Location: /feature/uptime-monitoring
Có một số cách khác để có được kết quả tương tự, bằng cách chuyển hướng trên chính máy chủ web
chỉ mục chuyển hướng. php trong Nginx
Bạn có thể chuyển hướng nếu chỉ mục. php nằm trong URL như thế này
if [$request_uri ~* "^/index\.php[/?][.*]"] {
return 301 $2;
}
Bạn có thể phải lặp lại điều này nếu bạn có các khối
//ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
1 khác nhau trong cấu hình Nginx của mìnhchỉ mục chuyển hướng. php trong apache
Bạn có thể thêm một dòng bổ sung vào
//ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
2 của mình$ cat .htaccess
RewriteEngine On
# Redirect if index.php is in the URL
RewriteRule ^index.php/[.+] /$1 [R=301,L]
Ít nhất đó là một regex/sửa chữa dễ dàng. . -]
chỉ mục chuyển hướng. php trong Caddy
Nó hơi cồng kềnh, nhưng điều này dường như hoạt động trong Caddy
$ cat Caddyfile
// {
tls {
ask //ohdear.app/caddy/allowed-domain
}
rewrite {
regexp ^/index.php/[.*]
to /{1}
}
redir {
if {uri} not {rewrite_uri}
/ {rewrite_uri}
}
}
Nó yêu cầu một
//ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
3 bên trong để khớp với chỉ mục. php và sau đó là một //ohdear.app/feature/uptime-monitoring
//ohdear.app/index.php/feature/uptime-monitoring
4 để chuyển hướng yêu cầu thực tế