如何将 UriBuilder 用于相对 Uri,以便输出与输入完全相同,但路径已更改?



>我需要一种对URL进行重定向的方法。输入可以是绝对或相对 URL,如下所示:

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;
}

我应该如何解决这个问题?

这涵盖了提供的所有示例:

Regex rg = new Regex(@"(^|/|//[^/]*/)test/");
var u2 = rg.Replace(u, "$1testcontent/");

目前还不清楚您是只想更改第一个test/还是全部,但使用此代码

https://example.com/test/test/something.js?v=1#a

成为

https://example.com/testcontent/test/something.js?v=1#a

最新更新