首页 文章

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

提问于
浏览
4

我是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而不是前缀 . 是否有一些除了第一行的功能,或者我只需要切换上面的行以获得正确的结果?

New problem:

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

5 回答

  • 1

    如果您以相反的顺序指定这些路由,它应该工作 . 首先执行最具体的路由,然后再执行更通用的路由 . 把它想象成“ grab 这个,这个,这个,然后在没有上述匹配时回到这个通用的” .


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

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

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

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

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

  • 13

    检查 public 文件夹中是否有 folder "admin" . 如果有的话,Laravel会自动重定向 .

  • 4

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

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

    Redirection problem Laravel从带有尾部斜杠的URL重定向到不带斜杠的URL - 默认行为 . (如果输入不带斜杠的URL - >不需要重定向)实际重定向不是问题 . 问题是,Laravel无法猜出"base" URL并为您生成错误的重定向网址 .

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

  • 0

    以下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 .

  • 3

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

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

相关问题