Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache mod_将查询字符串值重写为新URL_Apache_Mod Rewrite_Query String - Fatal编程技术网

Apache mod_将查询字符串值重写为新URL

Apache mod_将查询字符串值重写为新URL,apache,mod-rewrite,query-string,Apache,Mod Rewrite,Query String,我已经尝试了很多方法来做这件事好几天了,但不知何故还是一事无成。让我发疯。看起来应该相对容易些。。。。 我需要将旧应用程序的流量重写为新应用程序,但传递的值的格式不同。 这: http://oldapp.com/download.aspx?filename=FILE-01.pdf 必须重写为: https://NEWapp.com/this/that/FILE-01.pdf 因此,我必须从查询字符串中提取该值,在本例中为FILE-01.pdf,并将其合并到新的URL中。查询字符串中始终只有一个名

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

因此,我必须从查询字符串中提取该值,在本例中为
FILE-01.pdf
,并将其合并到新的URL中。查询字符串中始终只有一个名称/值对,它始终是“download.aspx?filename=”

看起来很简单,对吧?但我一直错过它。我已经尝试了很多不同的方法:

RewriteEngine On
RewriteCond %{QUERY_STRING} filename=([\S\s]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/$1 [R,L]
我正在使用IBMHTTPServerV8.0,它基本上是Apache2.2


解决方案:

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


当您从
RewriteCond
访问捕获组时,您需要使用反向引用操作符
%
,而不是
$
前缀,该前缀将用于arco444之后的
RewriteRule

中的捕获组。我将在末尾添加一个问号,以确保查询字符串不会转到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

解决方案:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^filename=([^&]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/%1? [R,L]
看起来arco444的优秀答案确实应该做到这一点,但是,这就是最终的效果:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^filename=([^&]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/%1? [R,L]
我不明白为什么这是有效的,下载时的特定匹配项是无效的,但我很高兴有一个解决方案。
非常感谢arco444和Dekel。

Ack!反向参考!我错过了,但是。。。仍然失败。但至少我现在得到了一个不同的错误。奇怪的是,它根本没有重写到新的URL,而是404在旧的URL上。而不是
https://newapp.com/ext/NEW-3.pdf
I404开启
http://oldapp.com/download.aspx?filename=NEW-3.pdf
。在这方面也获得了
重写日志级别2
。它报告:
Debug log:(2)使用请求的uri/download.aspx(1)pass-through/download.aspx
也许可以尝试
RewriteRule^/download.aspx$…
如果正斜杠是在
VirtualHost
级别定义的,而不是在
htaccess
文件中定义的,则正斜杠很重要。谢谢Dekel,这很有意义。但在我到达那一点之前,我还是有些东西断裂了。当我进一步试验时,我会记住那个问号。这真的应该是对我答案的评论,而不是为了一个小的修改而写一整份。FWIW我故意没有删除查询字符串,因为我不知道请求在Apache之后会出现在哪里,也不知道它是否可以被丢弃。@arco444,在我发布答案时,我无法对你的答案发表评论。很抱歉。如果你发现一个对你有帮助的答案,你应该真的而不是发布你自己的答案。在这种情况下,我的答案没有给你确切的答案,因为我似乎让你解决了这个问题,所以我将让你决定你是否选择这样做。