我刚刚使用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
但是这条规则不匹配任何网址......:'(
有没有人在这看到问题?
答案 0 :(得分:3)
查询字符串(传递给您文件的参数)不在RewriteRule中。
取自http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule:
图案不匹配 针对查询字符串。相反,你 必须使用RewriteCond %{QUERY_STRING}变量。您可以, 但是,在。中创建URL 替换字符串,包含 查询字符串部分。只需使用一个 替换内的问号 字符串,表示以下内容 文本应重新注入 请求参数。当你想要擦除 现有的查询字符串,结束 替换字符串只有一个 问号。要合并新查询 字符串与旧的,使用[QSA] 标志。
这里有两种可能性:
删除您的第一个RewriteRule并在继续使用框架之前在index.php中进行验证。初始查询应该在$_SERVER['REQUEST_URI']
或类似的地方提供。因此,请验证是否教程,采用 tid 参数,然后继续重定向:
header("Location: http://http://neranjara.org/article/id/$id");
exit();
使用RewriteCond和%{QUERY_STRING},而不是Apache文档中所述。此解决方案在类似this one。
//编辑:
查看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