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并删除路径中的所有//?
答案 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, "[^:]//", "/"));