You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Astro SSR端点如何拦截非本站发起的请求?

问题解答

为啥Postman能随便发请求?

CORS是浏览器专属的安全机制,服务器本身默认不会拦截跨源请求。Postman这类API测试工具根本不遵循CORS规则,不管你服务器有没有配置相关响应头,它都能正常发送请求并接收结果。你之前以为默认禁用CORS,其实是搞反了逻辑——浏览器会阻止前端脚本读取跨源响应(除非服务器返回合法的CORS头),但服务器本身不会主动拦截跨源请求。

怎么才能只让本站访问这个端点?

手动检查Origin头是可行的,但要注意边界情况;更推荐用框架/平台自带的CORS配置,这才是符合最佳实践的做法:

1. 手动验证Origin(需严谨)

如果你的应用没有内置CORS中间件,手动写验证逻辑也可以,但别忽略细节:

export async function POST({ request, clientAddress, site }) {
  const allowedOrigin = site.url; // 假设这是你的本站域名,比如"https://your-site.com"
  const origin = request.headers.get("origin");

  // 注意:同站请求可能不带Origin头(比如直接访问、传统表单提交),不能直接拒绝这类请求
  if (origin && origin !== allowedOrigin) {
    return new Response(
      JSON.stringify({ error: "禁止跨源访问" }),
      { status: 403, headers: { "Access-Control-Allow-Origin": allowedOrigin } }
    );
  }

  // 正常处理请求逻辑
  return new Response(
    JSON.stringify({ hello: 'there', origin: origin || allowedOrigin })
  );
}

关键注意点:

  • 不要拒绝没有Origin头的请求,很多合法的同站请求不会携带这个头。
  • 合法请求必须返回Access-Control-Allow-Origin头,否则浏览器会阻止前端脚本读取响应内容。

2. 使用框架/平台的内置CORS配置(推荐)

绝大多数后端框架或部署平台(比如Express、Vercel、SvelteKit)都提供了现成的CORS配置能力,比自己写验证逻辑更可靠:

  • 若使用Express,直接用cors中间件:
    const cors = require('cors');
    // 仅允许本站域名发起请求
    app.use(cors({ origin: 'https://your-site.com' }));
    
  • 若使用SvelteKit(从代码结构判断大概率是),可以在hooks.server.js中全局配置:
    export async function handle({ event, resolve }) {
      const allowedOrigin = event.site.url;
      const origin = event.request.headers.get('origin');
      
      if (origin && origin !== allowedOrigin) {
        return new Response(JSON.stringify({ error: '禁止跨源访问' }), { status: 403 });
      }
    
      const response = await resolve(event);
      response.headers.set('Access-Control-Allow-Origin', allowedOrigin);
      return response;
    }
    

核心总结

  • CORS是浏览器的限制,不是服务器的,所以Postman不受影响是正常现象。
  • 手动验证Origin可行,但要处理无Origin的场景,并返回正确的CORS响应头。
  • 优先使用框架/平台的内置CORS配置,既符合最佳实践,也不容易出错。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:36:23