规范化URI以使其与MakeRelativeUri一起正常工作

时间:2009-12-09 15:25:08

标签: .net vb.net uri normalization

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并删除路径中的所有//?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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

您是否可以使用此代码,由于//位于baseuri中,因此会提供“正确”的url并将被丢弃?

var x2 = new Uri(x, rel);

或者在网址中获取../回溯是否很重要?

MakeRelativeUri函数根据RFC确实正确,但根据常规约定失败。我建议你自己规范化网址,或者尽可能使用上面的例子。

x = new Uri(Regex.Replace(x.OriginalString, "[^:]//", "/"));