1

我需要将我的旧站点 URL(以 .aspx/asp 结尾,有几百个)迁移到新站点(以 .jsp/servlets 结尾)。我们选择在 Apache 中使用RedirectMapRedirectRule实现此迁移。纯 URLS 工作正常。但是源 URL 中区分大小写会导致重定向到 PAGENOTFOUND(例如,/magazine/Magazine.aspx?Id=4正在重定向到PAGENOTFOUND而不是http://mydomain.com/advice/beauty)。

另一个问题是它无法使用查询字符串重定向源 URL(例如,/Help/Help.aspx?HelpID=6正在重定向到PAGENOTFOUND而不是http://mydomain.com/services/essential-info) .

请在下面找到示例重定向映射文本文件。

/100001/Product.aspx    http://mydomain.com/urlredirect/p100003
/100002/Product.aspx    http://mydomain.com/urlredirect/p100005
/Help/Help.aspx?HelpID=6    http://mydomain.com/services/essential-info
/Help/Help.aspx?HelpID=11   http://mydomain.com/services/info-about-delivery-methods
/Magazine/Feature.asp?Id=816    http://mydomain.com/advice/all-about-you.asp
/Magazine/Magazine.aspx?Id=4    http://mydomain.com/advice/beauty
/Advive/all-about-you.asp   http://mydomain.com/advice/beauty-in-you

用 Apache 编写的重定向代码

RewriteEngine on
RewriteMap text2id txt:/opt/webserver/apache/conf/redirectmap.txt
RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1} [NC,R=301,L]
4

3 回答 3

3

Jon Lin 的回答帮助我在地图中搜索正确的重定向。我们更新了如下代码。

下面是实现的重定向代码。

RewriteEngine on
RewriteMap text2id txt:/opt/webserver/apache/conf/redirectmap.txt
# Base URL Does have a QS 
RewriteCond %{REQUEST_URI} ^(.*\.(aspx|asp).*)
RewriteCond ${text2id:%1?%{QUERY_STRING}} ^(.*\?.*)$
RewriteRule ^.*$ %1 [R=301,L]

# Base URL exists in the map
RewriteCond %{REQUEST_URI} ^(.*\.(aspx|asp).*)
RewriteRule ^.*$ ${text2id:%1|PAGENOTFOUND} [R=301,L]
于 2012-09-28T14:57:15.520 回答
1

您将无法匹配这样的查询字符串。

在你的规则中:

RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1} [NC,R=301,L]

唯一发送到重写映射的是 URI 路径,而不是查询字符串。您还需要将查询字符串传递到重写映射中:

RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1?%{QUERY_STRING}} [NC,R=301,L]
于 2012-09-21T07:27:01.410 回答
0

如果它不适合您,请在您的 QUERY_STRING 前面尝试双倍百分比...

作为附加信息,我和我的同事在一天的大部分时间里都在努力匹配重定向映射文件中的 QUERY_STRING。我们在 Windows 上运行 Helicon,所以不确定这是否与我们的解决方案与上述解决方案略有不同有关,但认为它可能会在我们的情况下帮助其他人......

我们的问题是上面的 RewriteRule 没有在我们的环境中正确解析 QUERY_STRING。生成的 URL 带有 URL 编码字符和单词 QUERY_STRING(如 %7bQUERY_STRING%7d)。

对于重写映射查找字符串中对 QUERY_STRING 的任何引用,我们最终不得不双重转义查询字符串环境变量。例如,在我们的 httpd.conf 文件中,上面的答案(顺便感谢您的回答)最终看起来像这样:

RewriteRule ^(.*\.(aspx|asp)) ${text2id:$1?%%{QUERY_STRING}} [NC,R=301,L]

请注意,QUERY_STRING 环境变量前面有双百分号 (%%),而不是单个百分号。这是我们可以让引擎解析嵌套在重写映射查找引用中的查询字符串的唯一方法。这对于我们环境中的RewriteCond也是如此。

这可能不适用于所有人,但如果您看到您的重定向 URL 包含类似 %7bQUERY_STRING%7d 的内容,那么您可能想尝试一下。它可以为您节省数小时的痛苦。

最好的,布兰登

于 2017-04-17T21:52:08.763 回答