.net 如何使用UriBuilder处理相对URI,使输出与输入完全相同,只是路径发生了变化?

jmp7cifd  于 2023-01-03  发布在  .NET
关注(0)|答案(1)|浏览(86)

我需要一个方法,这样做的网址重定向。输入可以是绝对或相对网址,如这些:

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

我应该怎样解决这个问题?

ycl3bljg

ycl3bljg1#

这包括所提供的所有例子:

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

相关问题