如何消除URL参数前的多余斜杠?(Netlify+Stripe+Nuxt场景)
问题描述
项目基于Netlify Functions、Stripe API、NUXT和Axios开发,支付流程逻辑如下:
- 前端通过Axios调用Netlify函数创建Stripe会话:
async checkout() { try { const response = await this.$axios.$post( "/.netlify/functions/payment_cart", { cart: this.shoppingCart, } ); window.location.href = response.stripe.url; } catch (error) { console.log(error); } }, - Netlify函数中构建Stripe会话时设置跳转URL:
const session = await stripe.checkout.sessions.create({ line_items: line_items, shipping_options: shipping_array, allow_promotion_codes: true, mode: "payment", success_url: process.env.BASE_URL + "/success?session_id={CHECKOUT_SESSION_ID}", cancel_url: process.env.BASE_URL + "/cancel", });
目前支付功能正常,但支付完成后跳转的URL会在success和参数前多出一个斜杠(示例:https://mywebsite.com/success/?session_id=123456789),导致Nuxt无法读取参数。本地环境无此问题,硬编码BASE_URL或临时用replace处理URL的方案无法兼容多参数,需解决多余斜杠问题。
解决方案
1. 用URL构造器替代字符串拼接(推荐)
手动拼接URL容易出现斜杠冲突,改用URL对象自动处理路径拼接:
// 在payment_cart函数中替换原success_url和cancel_url的拼接逻辑 const baseUrl = process.env.BASE_URL; // 构建success_url const successUrl = new URL('/success', baseUrl); successUrl.searchParams.set('session_id', '{CHECKOUT_SESSION_ID}'); // 构建cancel_url const cancelUrl = new URL('/cancel', baseUrl); // 创建Stripe会话 const session = await stripe.checkout.sessions.create({ line_items: line_items, shipping_options: shipping_array, allow_promotion_codes: true, mode: "payment", success_url: successUrl.toString(), cancel_url: cancelUrl.toString(), });
无论BASE_URL是否带末尾斜杠,URL对象都会自动生成正确格式的URL,避免多余斜杠。
2. 配置Nuxt路由强制去除末尾斜杠
在nuxt.config.js中设置路由的trailingSlash为false,强制所有路由不带末尾斜杠,同时Nuxt会自动重定向带斜杠的URL到不带的版本:
// nuxt.config.js export default { // ...其他配置 router: { trailingSlash: false } }
这样即使出现带斜杠的URL,也会被重定向到正确的格式,Nuxt就能正常读取参数。
3. 添加Netlify重定向规则
如果上述方法无效,可以在项目根目录创建_redirects文件,添加强制去除斜杠的规则:
# 全局去除所有路由的末尾斜杠 /* /:splat 301! # 或者针对success页面单独设置 /success/ /success 301!
规则中的301!表示永久重定向且忽略其他冲突规则,确保URL被修正为不带斜杠的格式。
内容的提问来源于stack exchange,提问作者Jeffrey van Zwam
相关产品推荐
相关产品推荐

