6
Dim x AS New URI("http://www.example.com/test//test.asp")
Dim rel AS New URI("http://www.example.com/xxx/xxx.asp")
Console.Writeline(x.MakeRelativeUri(rel).Tostring())

在这里输出是:

../../xxx/xxx.asp

这看起来是正确的,几乎所有的 Web 服务器都会将以下两个处理为相同的请求:

http://www.example.com/test//test.asp
http://www.example.com/test/test.asp

解决此行为的最佳方法是有任何 API 来执行此操作,还是应手动创建一个新的 URI 并删除路径中的所有 ////?

4

2 回答 2

5

似乎在 LocalPath 部分用一个斜杠替换所有多斜杠是最好的解决方案。即使在将 URL 传递给 ASP.net 时,IIS 也会这样做。

以下代码可以解决问题。

x = new Uri(string.Format("{0}://{1}:{2}{3}{4}", x.Scheme, x.Host, x.Port, Regex.Replace(x.LocalPath, @"(?<!\:)/{2,}", "/"), x.Query));
于 2011-11-18T20:17:03.237 回答
0

首先,您的代码不是 C# 而是 VB,所以标签是错误的。

你可以改用这个代码吗,它给出了“正确的”url,因为 // 在 baseuri 中并且将被丢弃?

var x2 = new Uri(x, rel);

或者在 url 中获取 ../ 回溯是否重要?

MakeRelativeUri 函数根据 RFC 确实是正确的,但根据正常约定它会失败。我建议您自己规范化 url,或者尽可能使用我上面的示例。

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/"));
于 2009-12-09T22:24:25.760 回答