作业求助:新增控制器实现短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




