.htaccess 301重定向无法正常工作

时间:2009-12-30 11:04:08

标签: php apache .htaccess mod-rewrite

我在PHP / MySQL中有一个基本的CMS,内容管理员可以在系统中创建页面供公众查看。然后,每个页面都可以在http://www.example.com/pages.php?pid=123等网址上找到 现在,我想将请求重定向到http://www.example.com/pages.php?pid=123http://www.example.com/pages.php?pid=456

我已经从数据库中删除了pid=123页面,但由于cms代码,当某人尝试访问该页面时,该网站仍会返回202。我以为我可以在.htaccess中使用301重定向来进行重定向工作,即:

redirect 301 pages.php?pid=123 http://www.example.com/pages.php?pid=456

但这不起作用,Apache在尝试获取pid = 123页面时仍返回202。另外,我尝试过使用mod_rewrite,但它不起作用:

RewriteRule ^pages.php?pid=123$ pages.php?pid=456 [R=301,L]

任何可能出错的想法以及如何修复301重定向?

2 个答案:

答案 0 :(得分:1)

RedirectRewriteRule directive都在URL path上工作。在mod_alias(Redirect指令)中,您无法测试查询,在mod_rewrite(RewriteRule指令)中,您需要额外的RewriteCond directive

RewriteCond %{QUERY_STRING} (^|&)pid=123(&|$)
RewriteRule ^pages\.php$ /pages.php?pid=456 [R=301,L]

但如果您的CMS可以处理此类重定向肯定会更好,因为您的CMS最了解哪些URL有效且哪些不是。

答案 1 :(得分:0)

您可以使用header()在PHP中执行重定向(可能更多地了解重定向的位置)。

请注意,?是正则表达式使用的特殊字符,因此您的正则表达式与pages.phppid=123pages.phppid=123匹配。

即使这样,我也不认为查询字符串(包括?pid=123部分)在RewriteRule处理的URL中使用,因此您需要使用以下内容:

RewriteCond %{QUERY_STRING} ^pid=123$
RewriteRule ^pages.php$ pages.php?pid=456 [R=301,L]

这不应该按原样运作,但应该给你一些想法。