Laravel 有时显示 404 not found 页面

Posted

技术标签:

【中文标题】Laravel 有时显示 404 not found 页面【英文标题】:Laravel Sometimes Showing 404 not found page 【发布时间】:2021-03-07 00:20:18 【问题描述】:

我正在开发 Laravel 8,当我通过显示链接刷新页面或直接打开页面时有时会遇到问题 p>

未找到页面 404 错误,我在互联网上尝试了很多解决方案,但没有适合我的解决方案。

另一个注意事项:当我使用 ajax 发送请求时,它也会显示给我,这是显示给我的最多时间。

我的web.php

<?php

use App\Http\Middleware\AdminAuth;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

$adminPathName = env('ADMIN_PATH');

Route::get($adminPathName . '/test/locale', function ($locale) 
    session('lang', 'en');

    app()->setLocale($locale);
    echo App::getLocale();
);

Route::get('/', function () 
    return view('frontend.home');
);

$adminPathName = env('ADMIN_PATH');
$userPath = env('USER_PATH');

Route::get($adminPathName . '/login', 'Admin\LoginController@login');
Route::post($adminPathName . '/signin', 'Admin\LoginController@signin');
Route::group(['middleware' => ['AdminAuth']], function () 
    $adminPathName = env('ADMIN_PATH');
    Route::get($adminPathName . '/dashboard', 'Admin\AdminController@home');
    Route::get($adminPathName . '/languages/manage-languages', 'Admin\LanguageController@index');
    Route::post($adminPathName . '/languages/add-language', 'Admin\LanguageController@addLanguage');
    Route::post($adminPathName . '/languages/add-translate', 'Admin\LanguageController@addTranslate');
    Route::post($adminPathName . '/languages/update-translate', 'Admin\LanguageController@updateTranslate');
    Route::post($adminPathName . '/languages/remove-translate', 'Admin\LanguageController@removeTranslate');
    Route::post($adminPathName . '/languages/remove-language', 'Admin\LanguageController@removeLanguage');
    Route::post($adminPathName . '/languages/sync-language', 'Admin\LanguageController@syncLanguage');
    Route::get($adminPathName . '/languages/translate/langId', 'Admin\LanguageController@translateById');
);


// todo this route should be added below .
Route::get('/login/facebook/callback', 'User\LoginController@facebookCallback');

Route::group(['prefix' => '/locale', 'middleware' => \App\Http\Middleware\SetLocale::class, 'as' => 'locale'], function () 

    $userPath = env('USER_PATH');

    Route::get('/', function () 
        return view('frontend.home');
    );
    Route::get($userPath . '/login', 'User\LoginController@login');
    Route::post($userPath . '/signin', 'User\LoginController@signin');
    Route::get($userPath . '/create-account', 'User\UserController@createAccount');
    Route::post($userPath . '/complete-register', 'User\UserController@completeRegister');

    /* Facebook Login & Register  */

    Route::get($userPath . '/social/facebook/redirect', 'User\LoginController@facebookRedirect');
    /* ./ Facebook Login & Register  */

    /* Google Login & Register  */
    Route::get($userPath . '/social/google/redirect', 'User\LoginController@googleRedirect');
    Route::get($userPath . '/social/google/callback', 'User\LoginController@googleCallback');
    /* ./ Google Login & Register  */

    Route::get('/change-language/lang', 'User\WebSiteController@changeLanguage');

    Route::group(['middleware' => ['UserAuth']], function () 
        $userPath = env('USER_PATH');
        Route::get($userPath . '/dashboard', 'User\UserController@dashboard');
        Route::get($userPath . '/update-profile', 'User\UserController@userProfile');
        Route::get($userPath . '/website/create-website', 'User\WebSiteController@newWebsite');
        Route::post($userPath . '/card/upload-gallery', 'User\UserController@uploadGallery');
        Route::get($userPath . '/cards/new-card/card_lang', 'User\CardController@newCard');
        Route::get($userPath . '/cards/new-card/card_lang/card_key', 'User\CardController@newCard');
        Route::post($userPath . '/cards/get-card-gallery', 'User\CardController@getGalleryByCardId');
        Route::post($userPath . '/cards/update-card', 'User\CardController@updateCard');
        Route::post($userPath . '/cards/update-card-logo', 'User\CardController@updateCardLogo');

        Route::get($userPath . '/logout', function () 
            auth('UserAuth')->logout();
            return redirect(ulocale_path('/login'));
        );
    );


);


Route::group(['domain' => 'account.localhost'], function () 
    Route::get('/id/card', 'User\CardController@shoBusinessCardById');
);

还有.htaccess文件

RewriteEngine On
<IfModule mod_rewrite.c>
 #Session timeout

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

   Options +FollowSymlinks
   RewriteEngine On

   # Redirect Trailing Slashes...
   RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteCond %REQUEST_FILENAME -d [OR]
RewriteCond %REQUEST_FILENAME -f
RewriteRule ^ ^$1 [N]

RewriteCond %REQUEST_URI (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php


</IfModule>

错误出现在以下路线中的次数最多:

 Route::post($userPath . '/cards/get-card-gallery', 'User\CardController@getGalleryByCardId');

控制器端getGalleryByCardId

public function getGalleryByCardId(Request $request)

    $imgs = DB::table('card_docs')
        ->where('user_id', usession('user_id'))
        ->where('card_key', $request->card_key)->get();

    return $imgs;

【问题讨论】:

有时错误很难调试。你还没有找到任何使它成为 404 的序列吗?关于 404 错误,如果你刷新页面,你会得到什么?又是 404 吗? 请分享操作 CardController@getGalleryByCardId 的操作代码 可能当env() 在路由中调用可能是问题所在。为什么不尝试在配置文件中设置所需的值。这样,这些值将与其他配置值一起缓存。另一件事是为什么不使用 Route::prefix() 而不是在每个路由上使用变量 不在路由中使用 env() 调用,使用路由前缀,缓存路由和配置应该最有可能解决您手头的问题。当 Laravel 尝试通过 DotEnv 读取 .env 并遇到任何问题时,它不会在引导时出错(一些旧线程 L5.2 天),这意味着当正在读取路由时(没有缓存)你的 env() 调用返回 null 所以路由 url 改变,因此 404 错误 - 我的想法 间歇性地,当您收到 404 错误时,您是否还会在日志中看到与数据库或加密相关的错误 - 如果是,那么很可能是 .env 文件没有被读取或读取延迟。 【参考方案1】:

根据您的描述,我觉得您的路由文件中的 env() 调用可能是问题所在。

当 Laravel 由于加载时间延迟或任何其他问题而无法从 .env 文件中读取环境值时,它不会给出与环境变量不可用相关的任何错误,但会继续处理。

由于您的路由文件使用 env().env 获取值,这些值不可用会更改您的路由的 url,因此您可能会收到 404 错误。

$userPath = env('USER_PATH')$adminPath = env('ADMIN_PATH') 将导致$userPath 和$adminPath 的值都为空,如果在加载环境变量时出现问题,但会继续执行。

因此,无论何时在 url 中使用这些变量,这些 url 都会以 null 作为使用变量的值而改变

您可以在收到 404 时检查错误日志:如果它们有任何与数据库或加密相关的错误条目 - 很可能是由于 DotEnv 无法按时从 .env 读取

@Donkarnash 实际上我不是 Laravel 的专业人士,如何将其放入配置文件中?你能帮我解释一下吗?

您可以在config/custom.php 处创建一个新文件,取名您喜欢的任何名称,而不是custom.php

return [
    'userPath' => env('USER_PATH'),
    
    'adminPath' => env('ADMIN_PATH'),
];

然后您可以在您的路由文件中进行更改以将这些值与config() helper 一起使用

Route::get(config('custom.adminPath') . '/login', 'Admin\LoginController@login');
Route::post(config('custom.adminPath') . '/signin', 'Admin\LoginController@signin');
Route::prefix(config('custom.adminPath'))
    ->middleware(['AdminAuth'])
    ->group(function () 
        Route::get('/dashboard', 'Admin\AdminController@home');
        Route::get('/languages/manage-languages', 'Admin\LanguageController@index');
        Route::post('/languages/add-language', 'Admin\LanguageController@addLanguage');
        Route::post('/languages/add-translate', 'Admin\LanguageController@addTranslate');
        Route::post('/languages/update-translate', 'Admin\LanguageController@updateTranslate');
        Route::post('/languages/remove-translate', 'Admin\LanguageController@removeTranslate');
        Route::post('/languages/remove-language', 'Admin\LanguageController@removeLanguage');
        Route::post('/languages/sync-language', 'Admin\LanguageController@syncLanguage');
        Route::get('/languages/translate/langId', 'Admin\LanguageController@translateById');
    );

// todo this route should be added below .
Route::get('/login/facebook/callback', 'User\LoginController@facebookCallback');

Route::prefix('/locale/' . config('custom.userPAth'))
    ->middleware([\App\Http\Middleware\SetLocale::class])
    ->as('locale')
    ->group(function () 
        Route::get('/', function () 
            return view('frontend.home');
        );
        Route::get('/login', 'User\LoginController@login');
        Route::post('/signin', 'User\LoginController@signin');
        Route::get('/create-account', 'User\UserController@createAccount');
        Route::post('/complete-register', 'User\UserController@completeRegister');
        /* Facebook Login & Register  */

        Route::get('/social/facebook/redirect', 'User\LoginController@facebookRedirect');
        /* ./ Facebook Login & Register  */

        /* Google Login & Register  */
        Route::get('/social/google/redirect', 'User\LoginController@googleRedirect');
        Route::get('/social/google/callback', 'User\LoginController@googleCallback');

        Route::get('/change-language/lang', 'User\WebSiteController@changeLanguage');
        Route::group(['middleware' => ['UserAuth']], function () 
            Route::get('/dashboard', 'User\UserController@dashboard');
            Route::get('/update-profile', 'User\UserController@userProfile');
            Route::get('/website/create-website', 'User\WebSiteController@newWebsite');
            Route::post('/card/upload-gallery', 'User\UserController@uploadGallery');
            Route::get('/cards/new-card/card_lang', 'User\CardController@newCard');
            Route::get('/cards/new-card/card_lang/card_key', 'User\CardController@newCard');
            Route::post('/cards/get-card-gallery', 'User\CardController@getGalleryByCardId');
            Route::post('/cards/update-card', 'User\CardController@updateCard');
            Route::post('/cards/update-card-logo', 'User\CardController@updateCardLogo');

            Route::get('/logout', function () 
                auth('UserAuth')->logout();

                return redirect(ulocale_path('/login'));
            );
        );
    );

Route::group(['domain' => 'account.localhost'], function () 
    Route::get('/id/card', 'User\CardController@shoBusinessCardById');
);

通过使用来自 config 而不是 env 的值,您可以获得配置缓存的好处。

在生产中,您还可以通过缓存路由来缓解路由 url 相关问题 - 但为此您需要将基于闭包的路由转换为基于控制器的路由。

【讨论】:

以上是关于Laravel 有时显示 404 not found 页面的主要内容,如果未能解决你的问题,请参考以下文章

API POST 请求在邮递员和 Laravel 上返回 404 NOT FOUND PAGE

未找到 Laravel 6 css 和 js 文件( net::ERR_ABORTED 404 (Not Found) )

Laravel 6.0.3 未加载关键资源 App.js 或 App.css 404 Not Found

vuejs Newline required at end of file but not foun

任何获得 404 Not Found nginx/1.16.1 的 AWS EB Laravel 路由

Laravel 的 put/patch 没有进入我的更新方法,出现错误 404 page not found