我需要一个方法,这样做的网址重定向。输入可以是绝对或相对网址,如这些:
Inp: test/something.js?v=1#a
Out: testcontent/something.js?v=1#a
Inp: /test/something.js?v=1#a
Out: /testcontent/something.js?v=1#a
Inp: ://example.com/test/something.js?v=1#a
Out: ://example.com/testcontent/something.js?v=1#a
Inp: https://example.com/test/something.js?v=1#a
Out: https://example.com/testcontent/something.js?v=1#a
我知道我可以通过分配一个主机来"伪造"一个绝对的Uri
,这样我就可以访问Segments
属性并使用UriBuilder
。问题是我找不到一个好的方法来使输出与输入中可用的任何部分具有相同的格式。下面两个方法是我的尝试:我可以得到片段,修改它们并将它们重新连接起来,然后构建一个绝对的Uri
,问题是,MakeRelativeUri
改变了输出的形式。
static readonly Uri BaseUri = new("https://0.0.0.0/index.html/");
static string[] GetUriSegments(Uri uri)
{
return uri.IsAbsoluteUri ?
uri.Segments :
new Uri(BaseUri, uri.OriginalString).Segments;
}
static Uri CreateUri(Uri uri, string[] segments)
{
var isAbs = uri.IsAbsoluteUri;
var absUri = isAbs ? uri : new Uri(BaseUri, uri.OriginalString);
var builder = new UriBuilder(absUri)
{
Path = string.Join("", segments)
};
var result = builder.Uri;
if (!isAbs)
{
result = BaseUri.MakeRelativeUri(result);
}
return result;
}
我应该怎样解决这个问题?
1条答案
按热度按时间ycl3bljg1#
这包括所提供的所有例子:
不清楚您是希望只更改第一个
test/
还是全部,但使用以下代码变成