You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

作业求助:新增控制器实现短URL到完整URL的重定向

实现短URL重定向的完整思路

嘿,刚好做过类似的功能,给你拆解一下实现步骤,其实核心就是建立短码与原URL的映射关系,再通过控制器完成匹配和跳转:

1. 先搞定短码-原URL的存储

你之前用Hashids生成了短链,但得把这个短码和对应的完整URL存起来,不然重启服务后就找不到对应关系了。推荐用数据库(比如SQL Server + EF Core),开发阶段也可以先用内存缓存凑活:

示例映射模型(EF Core)

public class UrlMapping
{
    public int Id { get; set; } // 自增ID,用来生成Hashids短码
    public string ShortCode { get; set; } // Hashids生成的短码
    public string OriginalUrl { get; set; } // 原始完整链接
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}

然后在DbContext里添加DbSet,迁移生成数据库表就行。

2. 新增ShortenedUrl控制器处理重定向

新建一个控制器,专门负责接收短URL请求,查询映射后跳转:

using Microsoft.AspNetCore.Mvc;
using YourProjectName.Data;

public class ShortenedUrlController : Controller
{
    private readonly AppDbContext _dbContext;
    private readonly Hashids _hashids;

    // 构造函数注入DbContext和Hashids实例(注意Hashids的盐值要和生成短码时一致!)
    public ShortenedUrlController(AppDbContext dbContext, Hashids hashids)
    {
        _dbContext = dbContext;
        _hashids = hashids;
    }

    // 路由:localhost:xxxx/ShortenedUrl/{shortCode}
    [HttpGet("{shortCode}")]
    public IActionResult RedirectToOriginal(string shortCode)
    {
        // 1. 根据短码查询对应的原URL
        var urlMapping = _dbContext.UrlMappings.FirstOrDefault(u => u.ShortCode == shortCode);
        
        if (urlMapping == null)
        {
            // 短码不存在,返回404或自定义提示页
            return NotFound("该短链接不存在或已失效");
        }

        // 2. 重定向到原URL,推荐用301永久重定向(利于SEO),或者302临时重定向
        return RedirectPermanent(urlMapping.OriginalUrl);
    }
}

3. 生成短链时同步保存映射

之前生成短链的逻辑里,要把生成的短码和原URL一起存入数据库:

// 示例:生成短链并保存映射
public async Task<string> GenerateShortUrl(string originalUrl)
{
    // 1. 先检查原URL是否已存在映射(避免重复生成)
    var existingMapping = await _dbContext.UrlMappings.FirstOrDefaultAsync(u => u.OriginalUrl == originalUrl);
    if (existingMapping != null)
    {
        return existingMapping.ShortCode;
    }

    // 2. 新增映射记录,获取自增ID
    var newMapping = new UrlMapping { OriginalUrl = originalUrl };
    _dbContext.UrlMappings.Add(newMapping);
    await _dbContext.SaveChangesAsync();

    // 3. 用Hashids编码自增ID得到短码,更新映射记录
    var shortCode = _hashids.Encode(newMapping.Id);
    newMapping.ShortCode = shortCode;
    await _dbContext.SaveChangesAsync();

    // 4. 返回完整的短URL(比如 localhost:xxxx/ShortenedUrl/abc123)
    return $"{Request.Scheme}://{Request.Host}/ShortenedUrl/{shortCode}";
}

4. 一些细节注意点

  • Hashids盐值统一:生成短码和解析时要用同一个盐值,不然编码解码会不一致,建议在配置文件(appsettings.json)里配置,然后注入Hashids实例。
  • 重定向类型选择:如果短链不会变更,用RedirectPermanent(301);如果可能后续修改原URL,用Redirect(302)。
  • 参数校验:要校验原URL的合法性(比如是否是有效的HTTP/HTTPS链接),避免存入无效地址。
  • 过期处理:如果需要短链过期功能,可以给UrlMapping加个ExpiresAt字段,查询时判断是否过期。

这样用户点击短URL(比如localhost:xxxx/ShortenedUrl/abc123)时,就会触发ShortenedUrl控制器的RedirectToOriginal方法,查询到原链接后自动跳转过去啦~

内容的提问来源于stack exchange,提问作者exdrax

火山引擎 最新活动