404 Not Found,但路线存在于Laravel 5.4

时间:2017-05-01 06:17:48

标签: laravel laravel-5 phpstorm laravel-5.4

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

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

这是我的家

index.php

这是我的路线

web.php

28 个答案:

答案 0 :(得分:5)

尝试

php artisan route:clear
php artisan route:cache

然后输入此内容,以查看列表中是否存在您的路线

php artisan route:list

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


class VerifyCsrfToken extends Middleware {

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

}

答案 1 :(得分:4)

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

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

我建议的第二件事是确保URL与路由匹配。我无法告诉您多少次尝试找出为什么我的路线返回404的原因仅仅是因为当我的路线定义为/insertStudent时,我的表单就发布到了/admin/insertStudent之类的地方

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

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

答案 2 :(得分:4)

我遇到了同样的问题,并通过更改路线订购方式解决了该问题。

这是之前

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');

答案 3 :(得分:2)

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

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

问题应该在之后解决。

答案 4 :(得分:2)

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

结论

通过在 index.php 的同一文件夹位置添加 .htaccess 文件,它解决了我的 Laravel 项目中的 404 页面未找到错误。

答案 5 :(得分:2)

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

答案 6 :(得分:2)

我为自己的路线无法正常运转而发疯,这也是一个快速解决方案。我有以下路线:
users/{user}/user-detail-changes/{user-detail-change}/update-status
解决方法是重命名参数。 Laravel不接受减号-。 不必使用camelCase或下划线(_)变量命名约定。
所以它必须像:
users/{user}/user-detail-changes/{userDetailChange}/update-status

答案 7 :(得分:1)

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

还将httpd.conf中的内容从“要求全部拒绝”更改为“要求全部授予”,“全部允许覆盖”以及选项索引FollowSymLinks

赞: Capture

答案 8 :(得分:1)

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

就我而言,我尝试访问api端点,并且每次都找不到404资源。 添加Accept: application/json标头后,我得到了匹配路由的响应

答案 9 :(得分:1)

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

myproject

将在您使用时起作用:

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

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

答案 10 :(得分:1)

在 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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

该规定似乎清除了先前保留或部署的当前正在工作的站点的某些缓存,老实说,不知道自从数据库工作且单元测试通过以来发生了什么变化。

但是把它留在这里,以防有人帮忙。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

例如: 这不起作用:

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

这有效:

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

答案 17 :(得分:0)

确保,路线中传递的网址相同。检查表单中的参数和操作。要明确回答你的mvc

答案 18 :(得分:0)

对我来说,这是.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 :(得分:0)

也许这对某人有帮助,我解决了更改从我在拉拉韦尔(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')
  

答案 20 :(得分:0)

更新2020
上面有很多情况,我遇见了很长时间,但我仍然忘记了,有时我不知道为什么。这与某些网址格式相同,例如 abc.com/c/ {get_an_id} abc.com/c/get_text 。您可以更改顺序,但只有第一个可以运行,第二个URL可以运行404。

答案 21 :(得分:0)

别忘了您的路线顺序。例如,如果您想去/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');

答案 22 :(得分:0)

最近我遇到了同样的问题,我以为我使用的是保留字,在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']);

尽管这不是问题原因的解释,但也许此解决方法可以为您提供帮助。

答案 23 :(得分:0)

我遇到了同样的问题,并通过以下方式解决了

我已经编辑了.htaccess文件

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

希望它会为您服务

答案 24 :(得分:0)

尝试几次修复均无济于事后,更改服务器端口对我有用。我在loalhost:3000上运行,并更改为localhost:4000。我认为这可能与某些内存问题有关

答案 25 :(得分:-1)

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

转到cmd并点击cd#您的项目路径#

然后点击php artisan服务

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

答案 26 :(得分:-1)

dontforget,URL对文件夹名称区分大小写

答案 27 :(得分:-1)

请让Apache配置以下信息

class ViewController: UIViewController {
func longPress(gesture: UILongPressGestureRecognizer) {
    ////If buttonA was long pressed
    if gesture.state == .began {
        self.viewA.isHidden = true
    ////If buttonB was long pressed
    } else if gesture.state == .began {
        self.viewB.isHidden = true
    ////If buttonC was long pressed
    } else if gesture.state == .began {
        self.viewC.isHidden = true
    ////If buttonD was long pressed
    } else if gesture.state == .began {
        self.viewD.isHidden = true
    }
}

添加以下信息

in /etc/apache2/apache2.conf
位于公共文件夹中的

.htaccess文件确保它具有以下内容

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