mod_rewrite QUERY_STRING 值到新值 URL

mod_rewrite QUERY_STRING value to new URL

几天来我已经尝试了很多方法来做到这一点,但仍然不知何故无处可去。让我发疯。看起来应该是相对容易的.... 我需要将旧应用程序的流量重写到新应用程序,但传递的值的格式不同。
这个: http://oldapp.com/download.aspx?filename=FILE-01.pdf 必须重写为: https://NEWapp.com/this/that/FILE-01.pdf

所以我必须从 QUERY_STRING 中提取值,在本例中是 FILE-01.pdf,并将其合并到新的 URL 中。在 QUERY_STRING 中总是只有一对 name/value,并且总是 "download.aspx?filename="。

看起来很简单,对吧?但我一直想念它。我已经尝试了很多很多这样的变体:

RewriteEngine On
RewriteCond %{QUERY_STRING} filename=([\S\s]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/ [R,L]

我正在使用 IBM HTTP Server v8.0,它基本上是 Apache 2.2。

解决方案:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^filename=([^&]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/%1? [R,L]

尝试:

RewriteEngine On
RewriteCond %{QUERY_STRING} filename=([^&]+)
RewriteRule ^download.aspx$ https://NEWapp.com/this/that/%1 [R,L]

当您从 RewriteCond 访问捕获组时,您需要使用反向引用运算符 % 而不是 $ 前缀,后者将用于 RewriteRule

在 arco444 之后,我会在末尾添加一个问号,以确保查询字符串也不会到达 url 的末尾。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^filename=([^&]+)
RewriteRule ^download.aspx https://NEWapp.com/this/that/%1? [R,L]

如果您不添加问号,最后的 url 将是 https://NEWapp.com/this/that/FILENAME.ext?filename=FILENAME.ext

解决方案:

arco444 的出色回答似乎真的应该做到这一点,但是,这是最终起作用的:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^filename=([^&]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/%1? [R,L]

我不明白为什么这行得通,而 download.aspx 上的特定匹配却行不通,但我很高兴能找到解决方案。 非常感谢 arco444 和 Dekel。