Laravel干净的URL

时间:2014-01-28 10:23:53

标签: .htaccess laravel clean-urls

使用Laravel项目并尝试简单的URL重写工作。这是.htaccess文件,位于'/ public'文件夹中 - 你可以看到我添加了一个规则

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

但是,这只是404s。我怀疑默认规则是以某种方式打破它但是不知道足以解决它。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

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

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

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

请参阅:

答案 1 :(得分:0)

尝试更改规则的顺序:

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

答案 2 :(得分:0)

或者您可以使用Laravel的路线:

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

控制器:

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

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