【问题标题】:Laravel clean URLsLaravel 干净的 URL
【发布时间】:2014-01-28 10:23:53
【问题描述】:

在一个 Laravel 项目上工作,并试图让一个简单的 URL 重写工作。这是位于“/public”文件夹中的 .htaccess 文件——你可以看到我添加了一条规则

<IfModule mod_rewrite.c>
  Options -MultiViews
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [L]
  # above is default, rule added by me:
  RewriteRule ^articles/page/([a-zA-Z0-9-/]+)$ /articles?page=$1 [L]
</IfModule>

但是,这只是 404。我怀疑默认规则以某种方式破坏了它,但不知道如何修复它。

有人可以帮忙吗?

【问题讨论】:

  • 您在浏览器中访问的网址是什么?
  • /articles?page=2 应该变成 /articles/page/2

标签: .htaccess laravel clean-urls


【解决方案1】:

在我看来,您将articles/page/{slug} 转换为articles?page={slug} 的规则永远不会被击中。因为该规则是最底层的,并且您的 index.php 重写规则说它是“最后一个”规则 ([L]),并且每次都匹配它赢得的任何内容(即,您的新规则永远不会失败)。

RewriteBaseRewriteCond 之间移动您的文章特定规则,不要将其标记为最后一条规则(去掉[L]),然后重试。这应该将articles/page/{slug} 转换为articles?page=slug,然后将其传递给 index.php 规则。

您可能还需要QSA 重写规则选项以确保您创建的查询字符串适用于任何已经存在的查询字符串。

见:

【讨论】:

    【解决方案2】:

    尝试改变规则的顺序:

    <IfModule mod_rewrite.c>
      Options -MultiViews
      RewriteEngine On
      RewriteBase /
    
      # above is default, rule added by me:
      RewriteRule ^articles/page/([a-zA-Z0-9/-]+)/?$ /articles?page=$1 [L,QSA]
    
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^ index.php [L]
    </IfModule>
    

    【讨论】:

      【解决方案3】:

      或者你可以使用 Laravel 的路由:

      Route::get("/articles/page/{article}", "ArticleController@showArticle")
      ->where("article", "[a-zA-Z0-9/-]+");
      

      还有控制器:

      class ArticleController extends Controller {
          public function showArticle( $articleID ) {}
      }
      

      我认为这是一个更好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 2023-03-30
        • 2015-10-27
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        相关资源
        最近更新 更多