【问题标题】:Laravel slash after url redirects to root folderurl重定向到根文件夹后的Laravel斜杠
【发布时间】:2014-03-30 14:06:00
【问题描述】:

我是 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 它工作正常。

【问题讨论】:

  • 如果您有新问题,请点击 按钮提出问题。请勿在此处编辑您的帖子以添加新问题,这对用户如何回答您的原始问题不公平。

标签: php dynamic laravel routing admin


【解决方案1】:

如果您以相反的顺序指定这些路线,它应该可以工作。先做最具体的路线,然后再做更通用的路线。将其视为“抓住这个、这个和这个,然后在上述都不匹配时回退到这个通用的”。


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

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

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

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

或者,您可以完全删除 RewriteRule,尽量不要担心您的应用现在会同时响应网址 /laravel/public/admin/laravel/public/admin/

【讨论】:

  • @user1507868 用您问题第二部分的答案更新了我的答案。
  • 是的,它有效。另外,在访问页面之前清除缓存。
  • 响应这两个网址对于 SEO 来说是非常糟糕的做法,因为它被视为重复的内容。
  • 这很可能是真的,不过我想说的是,如果我现在正在设计搜索引擎排名算法,我肯定会做的一件事是确保 /some/url 和 @ 987654332@ 将被归类为同一事物(尤其是在内容相同的情况下),并且仅形成规范版本的约定(无斜线 IMO)。因此,尽管与搜索引擎排名算法专家相去甚远,但如果搜索引擎还没有这样做,我会感到惊讶。也就是说,这个“事实”被吹捧了很多,除了我的逻辑,我认为我从未听说过任何相反的事情,所以 YMMV。
【解决方案2】:

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

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

【讨论】:

  • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
【解决方案3】:

以下 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】:

    检查您的 public 文件夹中是否有 文件夹“admin”。如果有,Laravel 会自动重定向。

    【讨论】:

      【解决方案5】:

      因为顺序很重要,试试这个

      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

      【讨论】:

      • 我试过了,效果很好。谢谢!但现在我有第二个问题。当我去 /admin 它工作。但是当我转到 /admin/ 时,它会将我重定向到 localhost/admin 而不是 Laravel 的公用文件夹。
      • 请编辑您的问题并发布您尝试打开的完整网址和重定向到的完整网址。
      • 我将 url 更改为 in app/config/app.php 但 Laravel 仍然将我重定向到根文件夹。
      • 如果找到任何解决方案,我也会遇到同样的问题,而不是让我知道
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      相关资源
      最近更新 更多