在URL重定向到根文件夹后,Laravel斜杠

时间:2014-02-27 08:56:49

标签: php dynamic laravel routing admin

我是Laravel的新手,它似乎是一个很棒的框架,但在路由方面我有一个问题。我想将所有获取请求路由到一个名为PageController @ view的控制器操作,但是当前缀为admin时,我希望它路由到Admin \ AdminController @ view。我有以下代码:

Route::get('/{slug?}', 'PageController@view');

Route::group(array('prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'auth'), function()
{
    Route::get('/', 'DashboardController@main');
});

但是当我去:/ admin时,Laravel将它视为slug而不是前缀。是否有某些除第一行的函数或者我是否只需切换上面的行以获得正确的结果?

新问题:

但是当我去http://www.mysite.com/laravel/public/admin/时,我遇到了一个新问题,Laravel将我重定向到http://www.mysite.com/admin/而不是调用AdminController @ main。当我在最后删除斜杠时:http://www.mysite.com/laravel/public/admin它工作正常。

5 个答案:

答案 0 :(得分:13)

如果您以相反的顺序指定这些路线,它应该有效。首先执行最具体的路由,然后再执行更通用的路由。把它想象成“抓住这个,这个,这个,然后在没有上述匹配的情况下回到这个通用的那个”。


您的新问题在于Laravel 4.1附带的(错误的,IMO)重定向规则。规则非常假设您的Laravel public目录位于服务器的文档根目录中。这是规则:

RewriteRule ^(.*)/$ /$1 [L,R=301

正如您所看到的,那就是说“如果当前URL以斜线结尾,只需将其重定向到/ {url}”,从而摆脱斜线。只要您的安装位于服务器的文档根目录上,这一切都很好。

您可以通过在RewriteBase文件中指定该规则之上的RewriteBase /laravel/public(在您的情况下为public/.htaccess)来解决此问题,但当然,现在这将从环境更改为环境。这就是为什么我认为将Laravel 4.0的RedirectIftrailingSlash功能更改为.htaccess规则是一个坏主意。

或者,您可以完全删除RewriteRule,并尽量不要担心您的应用现在会对/laravel/public/admin/laravel/public/admin/这两个网址做出回应。

答案 1 :(得分:4)

检查公开文件夹中是否有文件夹" admin" 。如果有的话,Laravel会自动重定向。

答案 2 :(得分:3)

由于订单很重要,请试试这个

Route::group(array('prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'auth'), function()
{
    Route::get('/', 'DashboardController@main');
});

Route::get('/{slug?}', 'PageController@view');

重定向问题 Laravel从带有尾部斜杠的URL重定向到URL而不带斜杠 - 默认行为。 (如果输入的URL没有斜杠 - >>不需要重定向) 实际重定向不是问题。问题是,Laravel无法猜出正确的“基础”URL并为您生成错误的重定向URL。

打开app/config/app.php并设置url条目以匹配项目的根目录。我猜你的情况是http://www.mysite.com/laravel/public

答案 3 :(得分:1)

以下RewriteRule适合我。我不得不从上面的alexrussel的答案中删除/ in / $ 1。包括/将我重定向到根文件夹。

#For http://localhost/work/proj1/public/a/ RewriteBase is /work/proj1/public
RewriteBase /repo/qs/public
RewriteRule ^(.*)/$ $1 [L,R=301]

我在Linux Mint 17 64位上使用laravel v4.2,apache v2.4.7,php v5.5.9。

答案 4 :(得分:0)

如果您知道目录名称,请为其制定规则。这对我来说很好:

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

   RewriteEngine On

   RewriteRule ^(forum)($|/) - [L]

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

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