实际目录覆盖Laravel路由

时间:2013-08-05 17:20:40

标签: laravel laravel-4

我在Laravel的第一个项目中工作,这是一个带管理面板的简单网站:

在我的“public”文件夹中,我有一个名为“admin”的目录,其中我将所有样式和脚本对应于管理面板。我还在我的应用程序中定义了一个路径来处理“admin”GET:

Route::get('/admin', 'Admin\DashboardController@index');

问题是因为我的公共目录中有“admin”文件夹,Laravel忽略了我定义的“admin”路由,所以我无法访问正确的控制器。我怀疑它与.htaccess有关,但我不知道如何解决它。这就是我的htaccess现在的样子:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

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

3 个答案:

答案 0 :(得分:2)

您不能拥有与您的路线同名的公共目录 - 否则Laravel将如何知道“/ admin”是用于控制器还是用于样式等。

您应该将管理样式表等存储在/ assets / admin / *

答案 1 :(得分:1)

问题在于以下几行:

RewriteCond %{REQUEST_FILENAME} !-d

在您的示例中,这告诉Web服务器不要将/ admin路由发送到Laravel,因为它是一个物理目录。如果你删除它,那么/ admin路由应该工作。但是,这将阻止直接浏览到文件夹并获取目录列表,这应该不是问题。 htaccess中的下一行将允许您链接到管理目录中包含的资产文件,而不是由Laravel处理它们,因此不应将其删除。

较新版本的Laravel还包含:

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

应该更新到以下内容以避免管理路由上的重定向循环:

# Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

因此,如果使用最新版本的Laravel,您的htaccess文件应如下所示:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

答案 2 :(得分:-1)

对于routes.php:

Route::controller('admin/dashboard', 'Admin\DashboardController');

要在公共容器中使用资源,您现在可以使用:

<script type="text/javascript" src="{{Request::root();}}/assets/js/jquery.js"></script>

/public/assets/js/jquery.js中的资产

希望这有帮助。