为何访问含双斜杠的路径返回404?Fresh路由问题咨询
问题原因及解决方案
原因
Fresh框架(及其底层依赖的Deno HTTP服务器)默认会规范化请求路径,自动将多个连续斜杠合并为单个斜杠。这就导致你访问localhost:8000/api/A//B时,实际被服务器处理为/api/A/B,原始的双斜杠结构丢失,最终因路由不匹配返回404。
对于你需要支持的/api/https://example.com/这类路径,双斜杠是目标URL的一部分,但规范化后会被合并成/api/https:/example.com/,自然无法被正确捕获。
解决方案
1. 关闭路径规范化(推荐)
在Fresh的启动配置中,禁用Deno服务器的路径规范化功能,保留原始请求路径结构:
修改项目根目录的main.ts文件:
import { start } from "$fresh/server.ts"; import manifest from "./fresh.gen.ts"; await start(manifest, { server: { strictPath: false, // 禁用路径规范化,保留连续斜杠 }, });
设置完成后,再访问带双斜杠的路径时,ctx.params.url就能正确捕获原始带双斜杠的路径部分,比如访问/api/https://example.com/时,ctx.params.url的值为https://example.com/。
2. 直接从原始请求提取路径(备选)
如果不想修改全局服务器配置,可以直接从原始请求URL中截取未被规范化的路径段(优先推荐第一种方法,此方法依赖环境场景):
修改routes/api/[...url].ts的代码:
import { Handlers } from "$fresh/server.ts"; export const handler: Handlers = { GET(req) { // 截取/api/之后的原始路径段 const rawPathSegment = req.url.split("/api/", 2)[1] ?? ""; return new Response(rawPathSegment); }, };
这样即使路径被规范化,也能从完整请求URL中拆分出所需的目标部分。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

