Abd*_*leh 4 php routes http-status-code-404 laravel
我正在Laravel 8上工作,有时当我刷新页面或通过显示的链接直接打开它时会遇到问题
未找到页面 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');
});
Run Code Online (Sandbox Code Playgroud)
和.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>
Run Code Online (Sandbox Code Playgroud)
大多数情况下,错误显示在以下路线中:
Route::post($userPath . '/cards/get-card-gallery', 'User\CardController@getGalleryByCardId');
Run Code Online (Sandbox Code Playgroud)
控制器端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;
}
Run Code Online (Sandbox Code Playgroud)
根据您的描述,我认为env()您的路由文件中的调用可能是问题所在。
.env当 Laravel由于加载时间延迟或任何其他问题而无法从文件中读取环境值时,它不会给出与环境变量不可用相关的任何错误,但会继续处理。
由于您的路线文件用于从不可用的值env()中获取值,.env因此您的路线的 url 会发生变化,因此您可能会收到 404 错误。
如果加载环境变量时出现问题,但执行将继续,则将导致 $userPath 和 $adminPath 的值均为null $userPath = env('USER_PATH')。$adminPath = env('ADMIN_PATH')
因此,无论在 url 中使用这些变量的地方,这些 url 都会以 null 作为值进行更改
当您收到 404 时,您可以检查错误日志:如果它们有任何数据库或加密相关错误的条目 - 很可能是由于 DotEnv 无法按时.env读取
@Donkarnash 实际上我不是 Laravel 的专业人士,如何将其放入配置文件中?你能为我解释一下吗?
您可以以任何您喜欢的名称创建一个新文件,config/custom.php而不是custom.php
return [
'userPath' => env('USER_PATH'),
'adminPath' => env('ADMIN_PATH'),
];
Run Code Online (Sandbox Code Playgroud)
然后您可以在路由文件中进行更改以将这些值与config()帮助程序一起使用
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');
});
Run Code Online (Sandbox Code Playgroud)
通过使用配置中的值而不是 env,您可以通过配置缓存获得好处。
在生产中,您还可以通过缓存路由来缓解与路由 url 相关的问题 - 但为此,您需要将基于闭包的路由转换为基于控制器的路由。