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 サーバーが次の 2 つを同じ要求として処理します。

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

この動作を修正する最善の方法は何ですか?これを行うための API はありますか?それとも、手動で新しい URI を作成し、パス内の // をすべて削除する必要がありますか?

4

2 に答える 2

5

LocalPath 部分のすべてのマルチスラッシュを 1 つのスラッシュに置き換えることが最善の解決策のようです。IIS は、URL を ASP.net に渡す場合でもそうします。

次のコードはトリックを行います。

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であるため、タグが間違っています。

代わりにこのコードを使用できますか?//はbaseuriにあり、破棄されるため、「正しい」URLが得られますか?

var x2 = new Uri(x, rel);

または、URLで../バックトラックを取得することが重要ですか?

MakeRelativeUri関数はRFCに従って修正されますが、通常の規則に従って失敗します。URLを自分で正規化するか、可能であれば上記の例を使用することをお勧めします。

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