JavaScript 获取短链接原始地址的解决方案

JavaScript 获取短链接原始地址的解决方案

📦 方法 1:服务器代理(推荐)

前端代码

javascript 复制代码
async function getOriginalUrl(shortUrl) {
  try {
    const response = await fetch(`/api/unshorten?url=${encodeURIComponent(shortUrl)}`);
    const data = await response.json();
    return data.originalUrl;
  } catch (error) {
    console.error("获取失败:", error);
  }
}

// 使用示例
getOriginalUrl("https://s.coze.cn/t/45uxprrK8vU/")
  .then(original => console.log("原始链接:", original));

Node.js 服务器端代码

javascript 复制代码
const express = require('express');
const axios = require('axios');
const app = express();

app.get('/api/unshorten', async (req, res) => {
  const shortUrl = req.query.url;
  try {
    const response = await axios.head(shortUrl, { maxRedirects: 0 });
    
    // 检测重定向状态码 (301/302)
    if ([301, 302].includes(response.status)) {
      res.json({ originalUrl: response.headers.location });
    } else {
      res.json({ originalUrl: shortUrl });
    }
  } catch (error) {
    if (error.response?.status === 302 && error.response.headers.location) {
      res.json({ originalUrl: error.response.headers.location });
    } else {
      res.status(500).json({ error: "解析失败" });
    }
  }
});

app.listen(3000, () => console.log('Server running on port 3000'));

优点

  • 避开浏览器 CORS 限制
  • 完全可控
  • 可添加缓存/安全验证

缺点

  • 需要搭建后端服务

🌐 方法 2:纯前端尝试(受限)

javascript 复制代码
async function getOriginalUrl(shortUrl) {
  try {
    const response = await fetch(shortUrl, {
      method: 'HEAD',
      redirect: 'manual'
    });
    
    if ([301, 302].includes(response.status)) {
      return response.headers.get('location');
    }
    return shortUrl;
  } catch (error) {
    console.error("请求失败:", error);
  }
}

注意

  • 大多数短链接服务(如 s.coze.cn)会因 CORS 限制失败
  • 仅适用于设置了 Access-Control-Allow-Origin 的服务

🔌 方法 3:使用第三方 API

javascript 复制代码
async function getOriginalUrl(shortUrl) {
  const API_KEY = "YOUR_API_KEY";
  const apiUrl = `https://unshorten.me/api/v2/unshorten?url=${shortUrl}`;
  
  try {
    const response = await fetch(apiUrl, { 
      headers: { "Authorization": API_KEY } 
    });
    const data = await response.json();
    return data.resolved_url;
  } catch (error) {
    console.error("解析失败:", error);
  }
}

常用服务

⚠️ 重要注意事项

  1. 浏览器限制:前端直接获取受 CORS 策略限制
  2. 安全风险
    • 短链接可能指向恶意网站
    • 建议服务器端进行安全验证
  3. 服务稳定性
    • 短链接服务可能变更策略导致解析失效
    • 建议添加错误处理和重试机制
  4. 性能优化
    • 添加缓存机制(localStorage/服务器缓存)
    • 避免频繁请求同一短链接

推荐方案:优先使用服务器代理方案(方法1),提供最大的灵活性和可控性

相关推荐
毕设源码-邱学长几秒前
【开题答辩全过程】以 基于VUE的藏品管理系统的设计与实现为例,包含答辩的问题和答案
前端·javascript·vue.js
用户28907942162711 小时前
Spec-Kit应用指南
前端
酸菜土狗1 小时前
🔥 手写 Vue 自定义指令:实现内容区拖拽调整大小(超实用)
前端
ohyeah1 小时前
深入理解 React Hooks:useState 与 useEffect 的核心原理与最佳实践
前端·react.js
Cache技术分享1 小时前
275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!
前端·后端
apollo_qwe2 小时前
前端缓存深度解析:从基础到进阶的实现方式与实践指南
前端
周星星日记2 小时前
vue中hash模式和history模式的区别
前端·面试
Light602 小时前
Vue 高阶优化术:v-bind 与 v-on 的实战妙用与思维跃迁
前端·低代码·vue3·v-bind·组件封装·v-on·ai辅助开发
周星星日记2 小时前
5.为什么vue中使用query可以保留参数
前端·vue.js
lebornjose2 小时前
javascript - webgl中绑定(bind)缓冲区的逻辑是什么?
前端·webgl