如何修复Laravel 5.1 - 404 Not Found?

时间:2015-07-22 23:32:52

标签: php apache .htaccess laravel mod-rewrite

我第一次尝试使用Laravel 5.1。我能够安装它并https://sub.example.com/laravel/public/显示应该是什么。但是,我创建的视图给了我404错误页面找不到。

这是我到目前为止所做的:

我在laravel\app\Http\controllers\Authors.php

中创建了一个控制器

以下是Authors.php文件

背后的代码
<?php

class Authors_Controller extends Base_Controller {

    public $restful = true;

    public function get_index() {
        return View::make('authors.index')
            ->with('title', 'Authors and Books')
            ->with('authors', Author::order_by('name')->get());
    }
}

然后我在laravel\resources\views\Authors\index.blade.php

中创建了一个视图

以下是index.blade.php文件

背后的代码
@layout('layouts.default')


@section('content')
    Hello, this is a test
@endsection

然后我在laravel\resources\views\layouts\default.blade.php

中创建了一个布局

以下是default.blade.php文件

背后的代码
<!DOCTYPE html>
<html>
    <head>
        <title>{{ $title }}</title>
    </head>
    <body>

    @if(Session::has('message'))
        <p style="color: green;">{{ Session::get('message') }}</p>
    @endif

    @yield('content')
    Hello - My first test
    </body>
</html>

最后我在laravel\app\Http\routes.php

中创建了一条路线
<?php
Route::get('/', function () {
    return view('welcome');
});

Route::get('authors', array('as'=>'authors', 'uses'=>'authors@index'));

但由于某种原因,我一直没有找到404错误页面。

我通过取消注释行

在我的Apache 2.4.9上启用了mod_rewrite
LoadModule rewrite_module modules/mod_rewrite.so

然后重新启动Apache。

从我在php_info()输出中可以看出,mod_rewrite已启用

Loaded Modules 
core mod_win32 mpm_winnt http_core mod_so mod_php5 mod_access_compat mod_actions mod_alias mod_allowmethods mod_asis mod_auth_basic mod_authn_core mod_authn_file mod_authz_core mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi mod_dir mod_env mod_include mod_isapi mod_log_config mod_mime mod_negotiation mod_rewrite mod_setenvif mod_socache_shmcb mod_ssl 

我当前的.htaccess文件如下所示&#34;这是出厂默认设置&#34;

             选项-MultiViews     

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]

我还尝试根据[文档1

将其更改为以下代码
Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

然而,当我去

时,我仍然得到404页面
https://sub.example.com/laravel/public/authors

我做错了什么? 我该如何解决这个问题?

6 个答案:

答案 0 :(得分:14)

我看到了能够访问/ route的相同行为,但是当我第一次设置Laravel站点时,所有其他页面都返回404.

在apache配置文件httpd.conf或httpd-vhosts.conf中,您需要启用可放在.htaccess文件中的指令。

以下是我的VirtualHost配置示例:

<VirtualHost *:80>
    ServerAdmin admin@gmail.com
    DocumentRoot "C:/www/laravel_authority-controller_app/public"
    ServerName authoritycontroller.www
    ErrorLog "logs/AuthorityController.www-error.log"
    CustomLog "logs/AuthorityController.www-access.log" common
    <Directory "C:/www/laravel_authority-controller_app/public">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks Includes ExecCGI

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   AllowOverride FileInfo AuthConfig Limit
    #
    AllowOverride All

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
    </Directory>
</VirtualHost>

您的问题的关键条目是AllowOverride All。这应该足以使网站正常运行,但如果它们在整个网站上保持一致,您还可以加入optionsRequire all granted

答案 1 :(得分:4)

如果你在ubuntu上,你应该做3件事。  1.检查“/ var / www / html / YourProject / public / .htacess”是否是这样的。

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

2.在/etc/apache2/sites-available/000-default.conf

上添加以下行
<Directory "/var/www/html">
 AllowOverride all
 Require all granted
</Directory>

注意:请记住,这是一个系统文件,因此您应该使用此comamd

sudo gedit /etc/apache2/sites-available/000-default.conf 
  1. 最后启用重写模块。

    LoadModule rewrite_module modules / mod_rewrite.so

  2. sudo a2enmod rewrite
    

答案 2 :(得分:2)

如果你的Laravel路线不起作用,你就得到了#34; Not Found&#34;您尝试加载页面时出现错误,您的.htaccess文件很可能无法履行其职责。

密钥是apache AllowOverride指令。

如果您没有将AllowOverride设置为全部,则您的Laravel .htaccess文件(/public/.htaccess)无法启用mod_rewrite,您的路线也无法正常工作。< / p>

第一步是打开你的apache httpd.conf文件。在OS X中,它位于:

/private/etc/apache2/httpd.conf

选项1)修改主指令

这将更改所有网站的AllowOverride值。在httpd.conf文件中,查找main指令:

**<Directory "/var/www/html">
    ...
    AllowOverride None
    ...
</Directory>**

只需将其更改为:

**<Directory "/var/www/html">
    ...
    AllowOverride All
    ...
</Directory>**

选项2)向您网站的指令添加指令。

**

<VirtualHost 127.0.0.1:80>
        DocumentRoot "/var/www/html/epigroove/public"
        ...
        <Directory "/var/www/html/epigroove/public">
            AllowOverride All
        </Directory>
    </VirtualHost>

**

将更改保存到httpd.conf文件,重新启动或重新加载apache,您的路由应该正常运行。

答案 3 :(得分:1)

如果您在Linux上运行Apache HTTPD 2.2.15(在我的情况下是CentOS 6.7),那么目录指令将如下所示

<Directory />
    Options Indexes FollowSymLinks Includes ExecCGI  
    AllowOverride All  
    allow from all  
</Directory>  

您可能不需要选项行,除非您使用这些选项。

感谢2.4回答。它帮助我在2.2上为我解决了这个问题,我有另一个运行2.4的服务器我也可以应用它。

答案 4 :(得分:0)

此外,URL 区分大小写到文件夹名称

文件夹名称:camelCase 那么网址必须是localhost/camelCase/route-1

希望这有助于某人xD,有点傻了

答案 5 :(得分:0)

如果它在实时服务器上,尝试一下,它对我有用。

totalspeed is:  15