使用查询参数和 URL 中的 ~ 进行 301 重定向

Posted

技术标签:

【中文标题】使用查询参数和 URL 中的 ~ 进行 301 重定向【英文标题】:301 redirect with query parameters and ~ in URL 【发布时间】:2019-07-06 08:17:42 【问题描述】:

我有一个重定向问题,我想将带有查询参数的 url 完全重定向到另一个 PDF,例如:

原始网址: https://www.foo.bar.com/~/bar.pdf?la

重定向网址: https://www.bar.foo.com/foo.pdf

目前我的重写规则如下图:

RewriteRule ^/~/bar.pdf?la https://www.bar.foo.com/foo.pdf [R=301,L,NC]

如何编写一个 301 重定向,同时考虑波浪号和查询参数?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

您需要使用RewriteCond 用于检查 url 查询字符串的指令。您不能在 RewriteRule 中这样做。您网址中的查询字符串是 la

RewriteEngine on

RewriteCond ℅QUERY_STRING ^la$ [NC]
RewriteRule ^.*bar\.pdf$ /foo.pdf? [L,R=301]

【讨论】:

我能否在 .rewrite 文件中实现具有数十条重写规则的重写条件并确保它仅适用于一个规则? @Franchise 你只能使用一个Rule 每个RewriteCond(s) httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond) 这是否考虑到了~?【参考方案2】:

首先你的规则RewriteRule ^/~/bar.pdf?la https://www.bar.foo.com/foo.pdf [R=301,L,NC] 有几个问题。

首先,RewriteRule ^/ 在这里不适用,所以RewriteRule ^ 就足够了。 其次,你应该像这样RewriteRule ^\~ 逃避~ 最后,不要像bar.pdf?la 那样用RewriteRule 编写查询字符串,因为它不是URI 的成员。

该行应如下所示:

RewriteRule ^\~/bar.pdf https://www.bar.foo.com/foo.pdf [R=301,L,NC]

但查询字符串可能会附加到新目标,以防止在目标末尾添加?

RewriteRule ^\~/bar.pdf https://www.bar.foo.com/foo.pdf? [R=301,L,NC]

如果你想使用查询字符串值,你可以在它之前添加条件来使用它:

RewriteCond %QUERY_STRING ^(.*)$

您可以将^(.*)$ 更改为您想要的任何内容,您可以在目标中使用它,如下例所示:

RewriteCond %QUERY_STRING ^(.*)$
RewriteRule ^(.*)$  https://www.whatever.com/%1/$1 [R=301,L,NC]

所以,%1 引用这个条件 RewriteCond %QUERY_STRING ^(.*)$$1 引用这个条件 RewriteRule ^(.*)$ 等等。

【讨论】:

以上是关于使用查询参数和 URL 中的 ~ 进行 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL

htaccess 301 重定向某些 URL 模式

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

htaccess 301 重定向 - 删除查询字符串 (QSA)

重定向 301:带有参数但没有值的 URL

RedirectMatch 301 删除查询字符串/URL 参数