【问题标题】:mod_rewrite QUERY_STRING value to new URLmod_rewrite QUERY_STRING 值到新 URL
【发布时间】:2015-06-23 15:20:08
【问题描述】:

我已经尝试了很多天来做到这一点,但仍然不知何故无济于事。让我发疯。好像应该比较容易...... 我需要将旧应用程序的流量重写为新应用程序,但传递的值的格式不同。
这: 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 中始终只有一个名称/值对,并且始终为“download.aspx?filename=”。

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

RewriteEngine On
RewriteCond %{QUERY_STRING} filename=([\S\s]+)
RewriteRule ^(.*)$ https://NEWapp.com/this/that/$1 [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]

【问题讨论】:

    标签: apache mod-rewrite query-string


    【解决方案1】:

    试试:

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

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

    【讨论】:

    • 确认!反向引用!我错过了,但是......仍然失败。但至少我现在得到了一个不同的错误。奇怪的是,它根本不会重写新 URL,而是在旧 URL 上重写 40​​4。而不是https://newapp.com/ext/NEW-3.pdf I 404 on http://oldapp.com/download.aspx?filename=NEW-3.pdf
    • 对此也有RewriteLogLevel 2。它报告:Debug log: (2) init rewrite engine with requested uri /download.aspx (1) pass through /download.aspx
    • 也许可以试试RewriteRule ^/download.aspx$ ... 如果正斜杠是在VirtualHost 级别而不是在.htaccess 文件中定义的,那么正斜杠很重要
    【解决方案2】:

    在 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

    【讨论】:

    • 感谢 Dekel,这很有道理。但在我达到那个点之前,我仍然有一些问题。在我进一步实验时,我会牢记这个问号。
    • 这真的应该是对我的回答的评论,而不是为了一个小的修改而复制整个副本。 FWIW 我故意不包括删除查询字符串,因为我不知道请求在 Apache 之后的位置以及它是否可以被丢弃。
    • @arco444,当我发布答案时,我无法对您的答案发表评论。很抱歉。
    【解决方案3】:

    解决方案:

    arco444 的出色答案似乎确实应该做到这一点,但是,这才是最终奏效的方法:

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

    我不明白为什么这有效,而 download.aspx 上的特定匹配无效,但我很高兴有一个解决方案。 非常感谢 arco444 和 Dekel。

    【讨论】:

    • 如果您发现答案对您有帮助,您真的应该mark it as accepted 而不是发布您自己的答案。在这种情况下,我的回答并没有给你确切的答案,似乎已经让你解决了问题,所以无论你是否选择这样做,我都会由你决定。
    猜你喜欢
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多