2

我刚刚使用 Zend Framework 部署了一个新站点。由于我的教程很受欢迎,我想将任何教程请求重定向到新站点上的相关页面。到目前为止,这就是我所拥有的:

重写前的 URL:http: //neranjara.org/tutorials/ ?tid=56

重写后的网址:http: //neranjara.org/article/id/56

我尝试使用的 .htaccess 文件如下所示:

  $ 猫 html/.htaccess
  重写引擎开启

  RewriteRule 教程/\?tid=(.*)$ /article/id/$1 [R=301]
  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php

但是此规则不匹配任何 URL ... :'(

有人看到这里有问题吗?

4

3 回答 3

3

查询字符串(传递给您的文件的参数)不会在 RewriteRule 中。

取自http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule

模式不会与查询字符串匹配。相反,您必须使用带有 %{QUERY_STRING} 变量的 RewriteCond。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号,即可指示应将以下文本重新注入到查询字符串中。当您想删除现有的查询字符串时,只用问号结束替换字符串。要将新查询字符串与旧查询字符串组合,请使用 [QSA] 标志。

你有两种可能:

  1. 删除您的第一个 RewriteRule 并在您的 index.php 中进行验证,然后再继续您的框架。初始查询应该在$_SERVER['REQUEST_URI']或类似的地方可用。所以验证它是否是tutorials,获取tid参数,然后继续重定向:

    header("Location: http://http://neranjara.org/article/id/$id");
    exit();
    
  2. 如 Apache 文档中所述,使用 RewriteCond 和 %{QUERY_STRING} 代替。这个解决方案在这样的线程中讨论。

// 编辑:

看看Chris 的回答,他很友好地使用 QUERY_STRING 详细说明了解决方案。这可能是您想要使用的。谢谢克里斯。

于 2008-12-31T19:34:21.393 回答
3

根据您之前的条目:

  $ cat html/.htaccess
  RewriteEngine on

  RewriteRule tutorials/\?tid=(.*)$ /article/id/$1 [R=301]
  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php

我建议改用这个:

  $ cat html/.htaccess
  RewriteEngine on

  RewriteCond %{QUERY_STRING} ^tid=([^&]*)
  RewriteRule tutorials/ /article/id/%1 [R=301, L]

  RewriteRule !\.(js|ico|gif|jpg|png|css|xml|phps)$ index.php [L]

顺便说一句,这只是使用QUERY_STRINGmod_rewrite 中的变量可以做的许多事情的一个例子。我的投票投给了“lpfavreau”,因为这是他们回答中的选项#2。

于 2009-01-02T05:08:16.413 回答
-1

Zend 使用了 htaccess 可以提供的所有 htaccess 功能,因此有一个非常方便(可链接且有趣且没有很好的文档记录)的方法来在引导程序中实现这一点!

您必须在引导程序 (index.php) 中使用 Zend 路由器。可能是这样的:(这将是 foo.com/article/23

$router = $frontController->getRouter();

$route = new Zend_Controller_Router_Route('article/:id', array('id' => 1) ); $router->addRoute('article', $route);

更多信息在这里

于 2008-12-31T19:39:52.490 回答