找不到404,但是在Laravel 5.4中存在路由

Mel*_*iah 11 phpstorm laravel laravel-5 laravel-5.4

我正在使用PhpStorm。我可以运行并打开index.php,但是当我想按Submit按钮(登录后)时,找不到其显示404。

在Windows 10上运行的Web服务器Apache 2.4。

这是我的家

index.php

这是我的路线

web.php

Rub*_*nce 31

请确保您在 Apache 中配置了以下信息 /path/to/apache2/installation/conf/httpd.conf

<Directory "path/to/laravel/project/public">
    Allowoverride All
</Directory>
Run Code Online (Sandbox Code Playgroud)

对于.htaccess位于public/文件夹中的文件,请确保它包含以下内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
       Options -MultiViews
   </IfModule>
   Options +FollowSymlinks
   RewriteEngine On

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

   # Handle Front Controller...
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^ index.php [L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

然后启用Apachemod_rewrite模块:

sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)

  • 我花了很长时间才终于找到这个有帮助的答案。 (3认同)

Oll*_*lly 18

我遇到了同样的问题并通过更改路由的订购方式来解决它。

前:

Route::get('/p/{post}', 'PostsController@show');
Route::get('/p/create', 'PostsController@create');
Run Code Online (Sandbox Code Playgroud)

之后:(和那个 404 消失了)

Route::get('/p/create', 'PostsController@create');
Route::get('/p/{post}', 'PostsController@show');
Run Code Online (Sandbox Code Playgroud)

  • 我发现对于资源路线尤其如此。如果您需要为现有资源路由定义额外的路由,则必须在资源路由之前在 web.php 中声明它,否则将为该路由抛出 404 错误。 (4认同)
  • 谢谢你救了我的命。 (3认同)
  • 你救了我。我向 ResourceRegister 添加了一个新方法,但一整天都被卡住了。该路线也显示在路线:列表中。如果我有很多其他帐户,我会整天都来投票。再次感谢。 (2认同)
  • 以您给出的相同示例为例,我认为原因是,如果我们之前有 /p/{post} ,则路由会将 /p/create 的请求匹配到 /p/{post} ,并将 create 作为变量值匹配到 {邮政} 。 (2认同)

Chr*_*ish 16

我不完全确定为什么要进行所有否决,特别是因为这是一个常见问题,而对于Laravel环境新手来说,原因可能是隐藏的。我知道这是一篇旧文章,但我将其添加到此处以供将来的新手使用。

我建议尝试的第一件事是php artisan route:list从命令行(从项目根目录)运行。这将列出Laravel可以注册的所有路线,并且如果有任何错误,通常会在此处显示。

我建议的第二件事是确保URL与路由匹配。我无法告诉您有多少次我试图弄清为什么我的路线返回404的原因仅仅是因为我的表单正在张贴到诸如以下/insertStudent路线中/admin/insertStudent

我建议的第三件事是确保要调用的方法存在。是你的方法真的叫postSignInpostInsertStudent而不是简单的SignInInsertStudent?请记住,URL和方法名称均区分大小写,并且应与定义路由的位置,正在调用的URL以及正在接收请求的方法相匹配。

最终,如果所有检查都结束了,我可能建议您尝试的最后一件事正在运行php artisan route:clear。这将重置路由缓存。

  • 唯一需要建议的一点是确保您没有在路线中使用“$”。我尝试使用 /users/edit_project_access/{$userId}/{$projectId} 这也给了我一个 404。检查您的网址是否没有 $ 符号:/users/edit_project_access/{userId}/{projectId} (9认同)
  • 哦,是的@ChristoffX,这就是我的情况。我有“contacts/ads_off/{$contactId}”。没看到你的评论。谢谢! (3认同)
  • 我可以建议添加“检查路线排序”吗?这就是我做错的事 (2认同)

Ruh*_*ara 14

尝试

php artisan route:clear
php artisan route:cache
Run Code Online (Sandbox Code Playgroud)

然后输入这个,看看你的路线是否存在于列表中

php artisan route:list
Run Code Online (Sandbox Code Playgroud)

并且在 Middleware\VerifyCsrfToken.php 中也允许检查发布路由


class VerifyCsrfToken extends Middleware {

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'api/*'
    ];

}

Run Code Online (Sandbox Code Playgroud)


小智 12

还有一种可能性...如果控制器有 Laravel 的 findOrFail() 方法,并且找不到所查找的项目,则会返回 404 页面。


小智 12

我通过执行以下两个步骤在Larvel 8.34上修复了此错误

  1. php artisan route:clear
  2. 转到浏览器并(假设您的 URL 是 localhost:8000)输入localhost:8000/clear-cache。它应该显示“完成”。

该问题应该随后得到解决。


Ram*_*der 6

我遇到了同样的问题并通过以下方式修复

我已经编辑了 .htaccess 文件

RewriteEngine On
RewriteBase /path/of/project/folder/
# change above to your site i.e.,  RewriteBase /whatever/public/
Run Code Online (Sandbox Code Playgroud)

希望它对你有用


Ham*_*mid 6

这是一个老问题,但还很活跃。对于Windows用户如果使用资本项目中的字符(大写字母)的文件夹,你应该用你的浏览器一样。如果您的项目在"c:\xampp\htdocs\MyProject\"您应该使用MyProject作为 url 而不是myproject 例如在上面的项目 (MyProject) 以下路线中:

Route::get('/dashboard', function () {
    return 'welcome to dashboard!';
});
Run Code Online (Sandbox Code Playgroud)

如果您使用:

http://MyProject/dashboard
Run Code Online (Sandbox Code Playgroud)

但最好在目录中使用小写字符


Luk*_*nga 5

不要忘记路线的顺序。例如,如果您想要前往/path/second并注册以下路线:

Route::get('/path/{dynamic_second}', 'Controller@actionDynamic');

Route::get('/path/{dynamic_second}/{dynamic_third}', 'Controller@third');

Route::get('/path/second', 'Controller@action');
Run Code Online (Sandbox Code Playgroud)

这将被破坏,因为second被 消耗/path/{dynamic_second}

如果你想访问/path/second,你必须像这样列出你的路线:

Route::get('/path/second', 'Controller@action');

Route::get('/path/{dynamic_second}', 'Controller@actionDynamic');

Route::get('/path/{dynamic_second}/{dynamic_third}', 'Controller@third');
Run Code Online (Sandbox Code Playgroud)


小智 2

确保传递的 url 在您的路由中相同。检查表单中的参数和操作。要获得明确的答案,请发布您的 mvc