【问题标题】:404 Not Found, but route exist in Laravel 5.4404 Not Found,但 Laravel 5.4 中存在路由
【发布时间】:2017-09-28 15:10:48
【问题描述】:

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

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

这是我的家

这是我的路线

【问题讨论】:

  • 我认为你应该仔细阅读 Laravel 的文档。通过它laravel.com/docs/5.4/installation
  • 当这个页面不工作时,你在浏览器地址栏中看到的 URL 是什么?
  • 您应该包含您尝试提交的表单的确切错误和代码
  • 另一件事,即使它看起来不是在这里:如果您定义了类似 /planning/{weeknumber} 的路线,然后定义了另一个类似 /planning/day 的路线,则无法到达 /planning /day 除非您在另一个之前声明它,因为“day”将作为变量传递给第一条路由,并且您可能会得到 404,具体取决于您的控制器如何管理它。
  • 您能提供更多信息吗?表单发送到哪条路线?

标签: laravel laravel-5 phpstorm laravel-5.4


【解决方案1】:

确保传递的 url 在你的路由中是相等的。检查表单中的参数和操作。为了得到明确的答案发布你的 mvc

【讨论】:

    【解决方案2】:

    请确保您已使用/path/to/apache2/installation/conf/httpd.conf 中的以下信息配置 Apache

    <Directory "path/to/laravel/project/public">
        Allowoverride All
    </Directory>
    

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

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

    然后启用 Apache mod_rewrite 模块:

    sudo a2enmod rewrite
    

    【讨论】:

    • 你能进一步解释一下吗?我认为 Windows 上不存在 /etc/apache2/apache2.conf。此外,需要哪些部件,为什么?请记住,其他人应该能够从您的回答中学习
    【解决方案3】:

    别忘了,url 对文件夹名大小写敏感

    【讨论】:

    • 您能进一步解释一下这是什么意思吗?你是怎么猜到使用案例有问题的?如何解决?
    • 如果您的 htdocs 子文件夹包含大写字母,那么您必须使用大写 case.ie 调用 url。文件夹是 htdocs 中的 AvenGers,然后必须调用 localhost/AvenGers
    【解决方案4】:

    我不完全确定为什么所有反对票,特别是因为这是一个常见问题,而且对于 Laravel 环境的新手来说,原因可能是隐藏的。我知道这是一个旧帖子,但我在这里添加它以供未来的新手使用。

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

    我建议的第二件事是确保 URL 匹配路由。我无法告诉你有多少次我试图弄清楚为什么我的路线返回 404 仅仅是因为当我的路线被定义为 /admin/insertStudent 时,我的表单正在发布到 /insertStudent 之类的东西

    我建议的第三件事是确保您调用的方法存在。你的方法真的被称为postSignIn 和postInsertStudent 而不仅仅是SignIn 和InsertStudent?请记住,URL 和方法名称都区分大小写,并且应该与您定义路由的位置、正在调用的 URL 以及接收请求的方法相匹配。

    最后,如果一切顺利,我建议您尝试的最后一件事是运行php artisan route:clear。这会重置路由缓存。

    【讨论】:

    • 我将现有目录复制到新目录,同时运行php artisan route:clear,但仍然在新目录中找不到页面,但在旧目录页面上找到了。有什么想法吗?
    • @anunixercoder,我建议开始一个新问题,非常具体地说明您尝试过的内容以及遇到的错误。如前所述,运行 php artisan route:list - 在 route:list 以预期输出成功运行之前,您不会通过浏览器看到您想要的内容。
    • 唯一要建议的一点是确保您没有在路线中使用“$”。我尝试使用 /users/edit_project_access/{$userId}/{$projectId} 这也给了我 404。检查您的 URL 是否没有 $ 符号:/users/edit_project_access/{userId}/{projectId}
    • 我可以建议添加check route ordering 吗?那是我做错了
    • 哦,是的@ChristoffX,就我而言就是这样。我有“联系人/ads_off/{$contactId}”。在您发表评论之前没有看到它。谢谢!
    【解决方案5】:

    在尝试了几次修复都无济于事后,更改服务器端口对我有用。我在 loalhost:3000 上运行并更改为 localhost:4000。我认为这可能与一些记忆卡有关

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题并通过关注解决了

      我有编辑 .htaccess 文件

      RewriteEngine On
      RewriteBase /path/of/project/folder/
      # change above to your site i.e.,  RewriteBase /whatever/public/
      

      希望对你有用

      【讨论】:

      • 它对我有用!我有一个别名,并且正在处理我的本地主机的子文件夹。只有主页在工作。在公共文件夹的 htaccess 文件中添加 RewriteBase /myalias/ 后,我的路由开始工作!
      【解决方案7】:

      确保您添加了正确的 Accept 标头。

      在我的情况下,我尝试访问 api 端点,每次都收到 404 未找到资源。 当我添加 Accept: application/json 标头时,我得到了来自匹配路由的响应

      【讨论】:

      • 这个方法让我看到异常错误
      【解决方案8】:

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

      Route::get('/dashboard', function () {
          return 'welcome to dashboard!';
      });
      

      如果你使用会起作用:

      http://MyProject/dashboard
      

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

      【讨论】:

        【解决方案9】:

        我最近遇到了同样的问题,我以为我使用了保留字,但在 list of reserved words of PHP 中找不到。

        原来我的 Routes/web.php 是:

        Route::post('sysinfo/store',['as'=>'sysinfo.store', 'uses'=>'SysinfoController@store']);
        

        如下图我改成另一个名字后,就成功了!

        Route::post('newsysinfo/store',['as'=>'newsysinfo.store',   'uses'=>'SysinfoController@store']);
        

        奇怪的是我还有其他工作路线,例如:

        Route::get('sysinfo/',['as'=>'sysinfo.index',   'uses'=>'SysinfoController@index']);
        Route::post('sysinfo/{sysinfo}',['as'=>'sysinfo.update',   'uses'=>'SysinfoController@update']);
        Route::get('sysinfo/create',['as'=>'sysinfo.create',   'uses'=>'SysinfoController@create']);
        Route::get('sysinfo/{id}/edit',['as'=>'sysinfo.edit',   'uses'=>'SysinfoController@edit']);
        Route::get('sysinfo/{sysinfo}/destroy',['as'=>'sysinfo.destroy',   'uses'=>'SysinfoController@destroy']);
        

        虽然它不是对问题原因的解释,但也许这种解决方法可以帮助您。

        【讨论】:

        • 我敢打赌,您在sysinfo/{sysinfo} 的发帖路线正在回答您对sysinfo/store 的所有尝试
        【解决方案10】:

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

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

        这会中断,因为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');
        

        【讨论】:

          【解决方案11】:

          试试

          php artisan route:clear
          php artisan route:cache
          

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

          php artisan route:list
          

          并且在 Middleware\VerifyCsrfToken.php 中检查 post 路由是否允许

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

          【讨论】:

            【解决方案12】:

            2020 年更新
            上面发生了很多案例,我又遇到了一个很久以前遇到的案例,但我仍然忘记了,有时我不知道为什么。这是一些 url 模式是相同的,例如 abc.com/c/{get_an_id} 和 abc.com/c/get_text。您可以更改顺序,但只能运行第一个,第二个 url 为 404。

            【讨论】:

            • 这应该是它自己的问题。但问题是带有参数 ({get_an_id}) 的路径需要排在第二位。否则“get_text”将作为参数值发送。如果它已经是第二个并且得到 404,这可能是因为查找失败(即 abc.com/c/54 返回 404,因为您的数据库中没有与 54 匹配的 id)
            【解决方案13】:

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

            之前:

            Route::get('/p/{post}', 'PostsController@show');
            Route::get('/p/create', 'PostsController@create');
            

            之后:(那个 404 消失了)

            Route::get('/p/create', 'PostsController@create');
            Route::get('/p/{post}', 'PostsController@show');
            

            【讨论】:

            • 以您给出的相同示例,我认为原因是,如果我们之前有 /p/{post},则路由将请求匹配到 /p/create 到 /p/{post}用 create 作为 {post} 的变量值。
            • 我发现资源路由尤其如此。如果您需要为现有资源路由定义额外的路由,则必须在资源路由之前在 web.php 中声明它,否则会为该路由抛出 404 错误。
            【解决方案14】:

            我遇到了同样的问题,但解决方法就是这么简单:

            进入 cmd 并点击 cd #your project path#

            然后点击 php artisan serve

            将给定的服务器链接 (http://127.0.0.1:8000) 复制到您的浏览器,它会工作的!

            【讨论】:

              【解决方案15】:

              我对我的路线不起作用而发疯,这也是一个快速修复。我有以下路线:
              users/{user}/user-detail-changes/{user-detail-change}/update-status
              解决方法是重命名参数。 Laravel 不接受减号 -。 而不是您必须使用 camelCase 或下划线 (_) 变量命名约定。
              所以它必须是这样的:
              users/{user}/user-detail-changes/{userDetailChange}/update-status

              【讨论】:

                【解决方案16】:

                你好!我之前也遇到过这个问题。请检查您的 Apache 的 httpd.conf 文件。确保通过从代码的起始行中删除 # 来启用 LoadModule rewrite_module modules/mod_rewrite.so。

                并且还将 httpd.conf 内部从 Require all denied 更改为 Require all grant、AllowOverride All 和 Options Indexes FollowSymLinks

                像这样:

                【讨论】:

                • 是的,这是我的问题,新安装的 apache 没有 LoadModule 未注释。
                【解决方案17】:

                也许这对某人有帮助,我解决了这个问题,改变了我在 laravel 中的路线的顺序。

                在我的情况下,我有路由 ..users/crea --> 404 错误

                 Route::get('users', 'Admin\UserController@index')->name('users.index')
                 Route::put('users/{user}', 'Admin\UserController@update')->name('users.update')
                 **Route::get('users/crea', 'Admin\UserController@crea')->name('users.crea');**

                并修复

                 Route::get('users', 'Admin\UserController@index')->name('users.index')
                 *Route::get('users/crea', 'Admin\UserController@crea')->name('users.crea');*
                 Route::put('users/{user}', 'Admin\UserController@update')->name('users.update')
                  

                【讨论】:

                  【解决方案18】:

                  对我来说,这是 .htaccess 文件的问题。 确保您在 public_html 文件夹中有 .htaccess。 我从一台服务器下载了这个文件,但下载器删除了点(。)。然后当我在另一台服务器上上传时,点(。)丢失了,我得到了 404。

                  我的 .htaccess 如下所示:

                  # disable directory browsing, but specific file browsing is possible, e.g. /js/bootstrap.js
                          
                      Options ExecCGI Includes IncludesNOEXEC SymLinksIfOwnerMatch
                  #To set which file will be acted as index file: DirectoryIndex index.php
                  <IfModule mod_rewrite.c>
                      <IfModule mod_negotiation.c>
                          Options -MultiViews
                      </IfModule>
                  
                      RewriteEngine On
                  
                      # Redirect Trailing Slashes If Not A Folder...
                      RewriteCond %{REQUEST_FILENAME} !-d
                      RewriteRule ^(.*)/$ /$1 [L,R=301]
                  
                      # Handle Front Controller...
                      RewriteCond %{REQUEST_FILENAME} !-d
                      RewriteCond %{REQUEST_FILENAME} !-f
                      RewriteRule ^ index.php [L]
                  
                      # Handle Authorization Header
                      RewriteCond %{HTTP:Authorization} .
                      RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
                  </IfModule>
                  
                  
                  <Files 403.shtml>
                  order allow,deny
                  allow from all
                  </Files>
                  
                  # deny from some DDoS attackers ip
                  # deny from 69.171.251.0/24
                  
                  
                  # php -- BEGIN cPanel-generated handler, do not edit
                  # This domain inherits the “PHP” package.
                  # php -- END cPanel-generated handler, do not edit
                  

                  【讨论】:

                    【解决方案19】:

                    我正在使用 Homestead,在尝试了所有尝试后被卡住了很长一段时间,最终成功的是重新检查我的 Hosts 文件(在 *nix 系统上为/etc/hosts),验证我的 Homestead.yaml 配置文件,然后在 Homestead Vagrant Box 上运行“provision”命令。

                    该规定似乎已经清除了之前持有或部署当前工作站点的一些缓存,老实说无法理解由于数据库正在工作并且单元测试正在通过,发生了什么变化。

                    但是把它留在这里以防它可以帮助别人。

                    【讨论】:

                      【解决方案20】:

                      我想为使用 nginx 服务器并已配置服务器块(虚拟主机)的用户添加一件事。检查您的 nginx 配置文件中激活了哪个服务器块。

                      也在 /etc/hosts 文件中检查您是否使用了正确的 url 到您的服务器块。

                      还在那里检查您的 IP 地址。

                      加上提到的所有其他要点。

                      【讨论】:

                        【解决方案21】:

                        在网站托管时,请求的页面上出现 404 Not Found Error 问题。那时只有主页可以正常工作。如果我请求另一个页面,例如mydomain.com/any_page 然后它将我发送到 404 Not Found 错误然后我查看了我的控制器文件和其他路由文件以解决问题。最后我认为没有 .htaccess 文件当我刚刚将 .htaccess 文件添加到 laravel 项目的 index.php 的同一文件夹中时,它就会突出工作文件。

                        结论

                        通过在 index.php 的同一文件夹位置添加 .htaccess 文件,它解决了我的 laravel 项目中的 404 page not found 错误。

                        【讨论】:

                          【解决方案22】:

                          对我来说,这是一个权限问题。我登录时使用的用户没有必要的分配角色,该角色授予查看所述 URL/部分所需的权限。

                          【讨论】:

                            【解决方案23】:

                            在 Centos 上

                            1. 为应用程序文件和目录设置适当的权限。

                              chown -R apache.apache /var/www/YOUR_LARAVEL_APP
                              chmod -R 755 /var/www/YOUR_LARAVEL_APP
                              chmod -R 755 /var/www/YOUR_LARAVEL_APP/storage
                              
                            2. 启用 SELinux 的系统还运行以下命令以允许写入存储目录。

                              chcon -R -t httpd_sys_rw_content_t /var/www/myLaravelApp/storage
                              

                            最后,在网络浏览器中访问您的 Laravel 应用程序。

                            注意:如果您使用 Nginx,请使用 nginx.nginx 而不是 apache.apache。

                            【讨论】:

                              【解决方案24】:

                              确保你没有在同一个端口上运行另一个 laravel 项目。

                              【讨论】:

                                【解决方案25】:

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

                                【讨论】:

                                • 对我有用的最佳答案
                                【解决方案26】:

                                在我的例子中,我错误地覆盖了表单提交时的 crsf 令牌,它抛出了 404 而不是实际给出更有意义的消息。

                                【讨论】:

                                  【解决方案27】:

                                  我几乎尝试了上述所有解决方案,但都没有奏效。所以我决定将路线名称更改为其他名称并且它起作用了。

                                  例如: 这不起作用:

                                  Route::get('product/show/{id}', [SiteController::class, 'showProduct'])->name('product.show');
                                  

                                  这行得通:

                                  Route::get('raslimali/show/{id}', [SiteController::class, 'showProduct'])->name('product.show');
                                  

                                  【讨论】:

                                  • Habari 你有没有发现它为什么不起作用唯一的变化是产品到 raslimali。我认为这是问题所在 --> 还有一种可能……如果控制器有 Laravel 的 findOrFail() 方法,但没有找到要查找的项目,则返回 404 页面。
                                  【解决方案28】:

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

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

                                  这个问题应该会在之后解决。

                                  【讨论】:

                                  • 伙计,我花了大约一个小时试图弄清楚发生了什么!在运行route:clear 命令之前,所有新路由都失败了,谢谢!
                                  【解决方案29】:

                                  如果对于 API 路由,当给定请求的验证失败时 Content-Type 未设置为 application/json 时,也会发生这种情况。这就是我的问题。

                                  【讨论】:

                                    【解决方案30】:

                                    我遇到了同样的问题。原因是我正在发出 https 请求,但我没有在 apache vhost 中设置 https 配置。所以 apache 发送了 404。

                                    【讨论】:

                                      猜你喜欢
                                      • 2020-09-13
                                      • 1970-01-01
                                      • 2019-01-27
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2015-01-07
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多