如何在Azure下创建纯重定向HTTP站点?

shyt4zoc  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个静态网站foo.example.com,其中包含一个页面列表(几百个)。我想把这个网站迁移到另一个静态网站,作为子文件夹www.example.com/foo。在这一点上,我有一个列表的网址从foo.example.com和他们的相关网址下www.example.com/foo。Map是不规则的和偶然的。没有正则表达式可能重写旧的网址到新的,它必须被硬编码。
我正在寻找Azure下可用的服务来“绑定”那些旧URL与指向新URL的HTTP重定向。理想情况下,我会寻找一个无服务器的解决方案,或者更好的是一个完全静态的解决方案。在这种情况下,什么会起作用?我正在寻找一些尽可能可维护的东西,因为原始URL列表将来不会改变。

pgvzfuti

pgvzfuti1#

使用Azure Functions沿着Azure Blob Storage创建无服务器解决方案,用于将旧URL重定向到新URL。创建Azure Blob Storage帐户以存储新网站的静态内容。将静态文件上载到名为$web的容器中,这是用于在Azure Blob存储上托管静态网站的特殊容器。请确保在存储帐户的设置中启用静态网站托管。然后创建一个包含旧URL到新URL的Map的JSON文件。将此文件上载到Blob存储容器,以便Azure Function可以访问它。

{
  "/old-url-1": "/foo/new-url-1",
  "/old-url-2": "/foo/new-url-2",
  ...
}

在此函数中,您将读取包含URLMap的JSON文件,并根据传入的请求执行必要的重定向。

[FunctionName("UrlRedirect")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
        ILogger log)
    {
        string oldPath = req.Path;
        Dictionary<string, string> mappings = await GetMappings();

        if (mappings.TryGetValue(oldPath, out string newPath))
        {
            return new RedirectResult($"https://www.example.com{newPath}", permanent: true);
        }
        else
        {
            return new NotFoundResult();
        }
    }

    private static async Task<Dictionary<string, string>> GetMappings()
    {
        string connectionString = "<your_connection_string>";
        BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
        BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient("$web");
        BlobClient blobClient = containerClient.GetBlobClient("mappings.json");

        using MemoryStream memoryStream = new MemoryStream();
        await blobClient.DownloadToAsync(memoryStream);
        memoryStream.Position = 0;

        using StreamReader reader = new StreamReader(memoryStream);
        string json = await reader.ReadToEndAsync();

        return JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
    }

不要忘记更新旧域(www.example.com)的DNS设置foo.example.com,以指向Azure Functions App自定义域。

相关问题