重定向 url 保留其查询并添加固定查询
Redirect an url keeping its queries and adding a fixed one
我正在尝试从 url 重定向到另一个 url 但保留查询。
例如,来自
/oldurl?query1=yes&query2=yes&... (or any list of queries)
到
/newurl?fixedquery=yes&query1=yes&query2=yes&...
所以在实践中它会将旧的 url 及其查询重定向到新的 url,保留旧的查询,加上一个固定的查询。
这是我一直试图在 .htaccess 中使用(未成功)的内容:
RedirectMatch 301 /oldurl/?$ newurl/?fixedquery=yes&
我之前也试过用Rewrite
RewriteCond %{QUERY_STRING} ^fixedquery=yes$
RewriteRule ^oldurl/?$ newurl/? [R=301,L]
但这只是重定向 if for /oldurl
(添加 fixedquery
)并给出 404,以防我将查询传递给 oldurl(例如 /oldurl?var1=1
)。
我哪里错了?
您需要使用 mod_rewrite 来操作查询字符串。请尝试以下操作:
RewriteRule ^oldurl/?$ /newurl?fixedquery=yes [QSA,R=301,L]
您的示例 URL 省略了目标 URL 上的尾部斜线,所以我在这里省略了它。但是,在您的指令中,您是否包含它?
QSA
标记 appends/merges 来自请求的原始查询字符串。所以结果 URL 是 /newurl?fixedquery=yes&query1=yes&query2=yes&...
,其中 query1=yes&query2=yes&...
是在初始请求中传递的。
更新: 请注意,此规则需要靠近文件顶部,在 任何现有重写之前。 .htaccess
文件中指令的顺序可能很重要。首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并且您需要确保在测试之前清除浏览器缓存。
看看你的尝试...
RedirectMatch 301 /oldurl/?$ newurl/?fixedquery=yes&
RedirectMatch
(mod_alias) 指令仅匹配 URL-path,但正则表达式中没有捕获子组,因此 </code> 反向引用始终为空.</p>
<blockquote>
<pre><code>RewriteCond %{QUERY_STRING} ^fixedquery=yes$
RewriteRule ^oldurl/?$ newurl/? [R=301,L]
此 匹配 对 /oldurl?fixedquery=yes
的请求并重定向到 newurl/
- 完全删除查询字符串。然而,这也依赖于 RewriteBase
的设置,否则这将导致格式错误的重定向,暴露您的目录结构。
我正在尝试从 url 重定向到另一个 url 但保留查询。 例如,来自
/oldurl?query1=yes&query2=yes&... (or any list of queries)
到
/newurl?fixedquery=yes&query1=yes&query2=yes&...
所以在实践中它会将旧的 url 及其查询重定向到新的 url,保留旧的查询,加上一个固定的查询。
这是我一直试图在 .htaccess 中使用(未成功)的内容:
RedirectMatch 301 /oldurl/?$ newurl/?fixedquery=yes&
我之前也试过用Rewrite
RewriteCond %{QUERY_STRING} ^fixedquery=yes$
RewriteRule ^oldurl/?$ newurl/? [R=301,L]
但这只是重定向 if for /oldurl
(添加 fixedquery
)并给出 404,以防我将查询传递给 oldurl(例如 /oldurl?var1=1
)。
我哪里错了?
您需要使用 mod_rewrite 来操作查询字符串。请尝试以下操作:
RewriteRule ^oldurl/?$ /newurl?fixedquery=yes [QSA,R=301,L]
您的示例 URL 省略了目标 URL 上的尾部斜线,所以我在这里省略了它。但是,在您的指令中,您是否包含它?
QSA
标记 appends/merges 来自请求的原始查询字符串。所以结果 URL 是 /newurl?fixedquery=yes&query1=yes&query2=yes&...
,其中 query1=yes&query2=yes&...
是在初始请求中传递的。
更新: 请注意,此规则需要靠近文件顶部,在 任何现有重写之前。 .htaccess
文件中指令的顺序可能很重要。首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并且您需要确保在测试之前清除浏览器缓存。
看看你的尝试...
RedirectMatch 301 /oldurl/?$ newurl/?fixedquery=yes&
RedirectMatch
(mod_alias) 指令仅匹配 URL-path,但正则表达式中没有捕获子组,因此 </code> 反向引用始终为空.</p>
<blockquote>
<pre><code>RewriteCond %{QUERY_STRING} ^fixedquery=yes$
RewriteRule ^oldurl/?$ newurl/? [R=301,L]
此 匹配 对 /oldurl?fixedquery=yes
的请求并重定向到 newurl/
- 完全删除查询字符串。然而,这也依赖于 RewriteBase
的设置,否则这将导致格式错误的重定向,暴露您的目录结构。