如何在Zend Framework中使用mod_rewrite?

时间:2008-12-31 18:23:45

标签: php apache zend-framework mod-rewrite

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

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

重写后的

网址:http://neranjara.org/article/id/56

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

  $ cat html/.htaccess
  RewriteEngine on

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

但是这条规则不匹配任何网址......:'(

有没有人在这看到问题?

3 个答案:

答案 0 :(得分:3)

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

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

  

图案不匹配   针对查询字符串。相反,你   必须使用RewriteCond   %{QUERY_STRING}变量。您可以,   但是,在。中创建URL   替换字符串,包含   查询字符串部分。只需使用一个   替换内的问号   字符串,表示以下内容   文本应重新注入   请求参数。当你想要擦除   现有的查询字符串,结束   替换字符串只有一个   问号。要合并新查询   字符串与旧的,使用[QSA]   标志。

这里有两种可能性:

  1. 删除您的第一个RewriteRule并在继续使用框架之前在index.php中进行验证。初始查询应该在$_SERVER['REQUEST_URI']或类似的地方提供。因此,请验证是否教程,采用 tid 参数,然后继续重定向:

    header("Location: http://http://neranjara.org/article/id/$id");
    exit();
    
  2. 使用RewriteCond和%{QUERY_STRING},而不是Apache文档中所述。此解决方案在类似this one

  3. 的线程中讨论

    //编辑:

    查看Chris' answer谁使用QUERY_STRING来详细说明解决方案。这可能是你想要使用的。谢谢Chris。

答案 1 :(得分: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]
顺便说一句,这只是使用mod_rewrite中的QUERY_STRING变量可以做的很多事情的一个例子。我的投票是“lpfavreau”,因为这是他们回答的选项#2。

答案 2 :(得分:-1)

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

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

  

$ router =   $ frontController-> getRouter();

     

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

更多信息here