【问题标题】:Laravel default route for subdirectory in a route group with prefix带有前缀的路由组中子目录的 Laravel 默认路由
【发布时间】:2015-03-06 19:26:11
【问题描述】:

我有一个前缀为admin 的路由组。我希望如果输入 URL http://www.example.com/admin/,默认情况下会加载位于 http://www.example.com/admin/login 的登录页面。登录页面实际上是一个控制器,但我不介意admin/ 是否重定向到admin/login 或直接路由到其控制器。从我在这里看到的其他答案看来,重定向似乎更好地确保链接没有混乱。

我尝试了各种路由和重定向解决方案,包括建议的解决方案here,但我总是收到错误 404。推荐的正确方法是什么?

我的路线组如下所示:

Route::group(array('prefix' => 'admin', 'namespace' => 'MyNamespace\Controllers\Admin'), function()
{    
    //the following work fine
    Route::get('login', array('uses' => 'AdminLoginController@showLogin'));
    Route::post('login', array('uses' => 'AdminLoginController@doLogin'));
    Route::get('logout', array('uses' => 'AdminLoginController@doLogout'));

    //other resource routes for the respective admin pages
});

在路由组之外我添加了以下内容,这样即使http://www.example.com/admin 没有尾部斜杠也可以进入登录页面,效果很好。

Route::get('admin', function() { return Redirect::to("admin/login"); });

问题出在http://www.example.com/admin/,它给出了错误 404。我尝试了以下所有方法(分别明显),但没有一个有效。他们都在路由组内。

    Route::get('/', function() { return Redirect::to("admin/login"); });

    Route::get('', function() { return Redirect::to("admin/login"); });

    Route::get('/', function() { return Redirect::to("login"); });

    Route::get('', function() { return Redirect::to("login"); });

    Route::get('/', array('uses' => 'AdminLoginController@showLogin'));

    Route::get('', array('uses' => 'AdminLoginController@showLogin'));

我在路由组外也试过这个:

    Route::get('admin/', function() { return Redirect::to("admin/login"); });

它们都不起作用。为带有前缀子目录的路由组设置默认路由的正确方法是什么?

【问题讨论】:

  • 当您尝试Route::get('/', function() { return Redirect::to("admin/login"); });(顺便说一句应该是正确的)时,您在路由组之外还有Route::get('admin')吗?
  • 我尝试删除Route::get('admin')并添加Route::get('/')重定向,效果保持不变。使用尾部斜杠它不起作用,没有它它起作用。不过,我还观察到了其他一些东西,可能相关也可能不相关。在我正在测试的PC上,域为http://localhost/myapp/admin/,由于某种原因,它重定向到http://localhost/admin/,省略了URL中的myapp,以HTTP 404结束。而http://localhost/myapp/admin(没有尾部斜杠) 正确重定向到http://localhost/myapp/admin/login
  • 我明白了。您应该使用http://localhost/myapp/public/admin 或设置一个虚拟主机,其文档根目录指向公共目录。然后你可以像myapp.dev/admin一样使用它
  • 对不起,我忘了提及我已将 /public 中的内容移至根文件夹。我不认为它是相关的。
  • 我发现了那个奇怪的重定向是怎么回事。我在.htaccess 中有这一行,它是由 Laravel 默认生成的。 ` RewriteRule ^(.*)/$ /$1 [L,R=301]` 我不知道是什么原因,但这是我从/myapp/admin/重定向到/admin的原因404。我不知道为什么/myapp被省略了,它是应用程序的根文件夹。

标签: php laravel laravel-4 laravel-routing


【解决方案1】:

.htaccess中使用此代码

因此您的服务器会将带有斜杠的 url 重定向到不带斜杠的 url。

<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On

# redirect everything to url without trailing slash

RewriteCond %{HTTPS} =on
RewriteRule ^(.+)$ - [env=ps:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.+)$ - [env=ps:http]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d


RewriteCond %{REQUEST_METHOD} ^GET

RewriteRule ^(.+)/$ %{ENV:ps}://%{SERVER_NAME}/$1 [R=301,L]

# pretty urls

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^ index.php [L]
</IfModule>

laravel 默认先做重定向,后来去掉了。

【讨论】:

  • 其实我想要的恰恰相反。如果它没有尾部斜杠并且是一个文件夹,我想将其重定向为具有尾部斜杠。不过谢谢指点!在 Laravel 生成的 .htaccess 中,我确实拥有它,我将其注释掉,它现在可以工作了!
  • 如果你想从“不带斜线”到斜线,则需要在.htaccess中删除一行RewriteRule ^(.*)/$ /$1 [L,R=301]
猜你喜欢
  • 2020-05-17
  • 2016-12-10
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多