我在PHP / MySQL中有一个基本的CMS,内容管理员可以在系统中创建页面供公众查看。然后,每个页面都可以在http://www.example.com/pages.php?pid=123
等网址上找到
现在,我想将请求重定向到http://www.example.com/pages.php?pid=123
到http://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重定向?
答案 0 :(得分:1)
Redirect
和RewriteRule
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=123
和pages.phppid=123
匹配。
即使这样,我也不认为查询字符串(包括?pid=123
部分)在RewriteRule
处理的URL中使用,因此您需要使用以下内容:
RewriteCond %{QUERY_STRING} ^pid=123$
RewriteRule ^pages.php$ pages.php?pid=456 [R=301,L]
这不应该按原样运作,但应该给你一些想法。