如何根据查询字符串重定向 URL?

Posted

技术标签:

【中文标题】如何根据查询字符串重定向 URL?【英文标题】:How to redirect URLs based on query string? 【发布时间】:2012-10-15 21:53:18 【问题描述】:

我成功地将一个 Wordpress 网站大规模迁移到 Drupal。不幸的是,在 Wordpress 中,内容 URL 类似于 www.example.org/?p=123。我的域仍然相同,但我想通过 htaccess 进行重定向,因为 Drupal 不允许 URL 为 www.example.org/?p=123。换句话说,内容与在 Wordpress 中的 URL 不同。例如,新的 Drupal URL 将类似于 www.example.org/content/MyNewPage

我在我的 .htaccess 文件中尝试过,但它不起作用

Redirect 301 /\?p=375 http://www.example.org/content/MyNewPage

所以我尝试了以下方法,但它也不起作用。

Redirect 301 /\?p\=375 http://www.example.org/content/MyNewPage

作为一个测试,我尝试了下面的方法并且成功了。

Redirect 301 http://www.example.org http://www.google.com

我确保我的重定向规则位于我的 .htaccess 列表的顶部,因此将首先对其进行评估。我该如何解决?

【问题讨论】:

【参考方案1】:

Redirect 和 RedirectMatch 都不允许您为重定向源指定查询字符串。 [Source]

您必须使用 mod-rewrite 根据查询字符串进行重定向:

RewriteCond %QUERY_STRING  ^p=375$
RewriteRule (.*)  http://www.example.org/content/MyNewPage?  [R=301,L]

【讨论】:

不幸的是,我被重定向到未找到的 404 页面,并且我的 URL 仍然显示example.org/?p=375。我可以确认“内容/MyNewPage”确实存在并且有效。我还可以确认我的 RewriteRules 正在运行,因为它们在 Drupal 中运行良好。 清除浏览器缓存再试一次,浏览器缓存301 Permanent redirects 好建议,但现在 Firefox 说它正在重定向为无限循环。 “Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。”该 URL 显示为 example.org/content/MyNewPage?p=375【参考方案2】:

你可以考虑在你的 htaccess 中使用 ModRewrite

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

RewriteCond %QUERY_STRING     ^p=345$    [NC]
RewriteRule index.php content/MyNewPage [NC,L,R=301]

</IfModule>

您还可能希望将旧页面 id 传递给连接的新 URL(或者可能通过 QS?):

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

RewriteCond %QUERY_STRING     ^p=(.*)$    [NC]
RewriteRule index.php content/MyNewPage-%1 [NC,L,R=301]

</IfModule>

【讨论】:

以上是关于如何根据查询字符串重定向 URL?的主要内容,如果未能解决你的问题,请参考以下文章

浏览器如何使用查询字符串缓存 301 重定向

IIS URL 重写模块:基于 QueryString 的重定向

WordPress 重定向插件,用于在目标 URL 中包含查询参数

带有查询字符串的 URL 重定向 - htaccess

url重定向时如何使用Powershell从Web下载文件

如何根据符合特定条件的国家/地区代码重定向URL