Chỉ mục Laravel PHP không hoạt động

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.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

Chỉ mục Laravel PHP không hoạt động

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.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:clear7

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:clear
7. 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ành
    ln -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_html
1 là tên người dùng của bạn và
ln -s /home/user/laravel_project/public /home/user/public_html
2 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

https://ohdear.app/feature/uptime-monitoring
https://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

https://ohdear.app/feature/uptime-monitoring
https://ohdear.app/index.php/feature/uptime-monitoring
0

removeIndexPhpFromUrl();
    }

    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 "http://ohdear.app.test/index.php/pricing"
HTTP/1.1 301 Moved Permanently
Location: /pricing

$ curl -i "http://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

https://ohdear.app/feature/uptime-monitoring
https://ohdear.app/index.php/feature/uptime-monitoring
1 khác nhau trong cấu hình Nginx của mình

chỉ mục chuyển hướng. php trong apache

Bạn có thể thêm một dòng bổ sung vào

https://ohdear.app/feature/uptime-monitoring
https://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
https:// {

	tls {
		ask https://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

https://ohdear.app/feature/uptime-monitoring
https://ohdear.app/index.php/feature/uptime-monitoring
3 bên trong để khớp với chỉ mục. php và sau đó là một
https://ohdear.app/feature/uptime-monitoring
https://ohdear.app/index.php/feature/uptime-monitoring
4 để chuyển hướng yêu cầu thực tế