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

Laravel:支持含斜杠URL参数片段的正确方法

问题

在Laravel的web.php中定义了如下路由:

Route::delete('/app/charges-for-order/{orderId}', 'AppController@deleteOrderCharges');

该路由在orderId不含斜杠时可正常工作,但当orderId包含斜杠(如11/11)时出现异常。

最初尝试在前端使用encodeURIComponent生成URL:

/app/charges-for-order/${encodeURIComponent(orderId)}

生成的URL为/app/charges-for-order/11%2F11,但访问时返回404,显然Laravel仍将%2F视为斜杠进行路由匹配。

如何让orderId支持(编码后的)斜杠并正常匹配路由?是否有Laravel认可的替代编码方案?

解决方案

方法一:修改路由参数正则约束 + 服务器配置

Laravel路由默认会将%2F解码为斜杠,导致参数被分割。可以通过路由正则约束让orderId匹配任意字符,再配合服务器配置允许编码斜杠:

  1. 修改路由,给orderId添加正则约束,允许匹配任意内容:
Route::delete('/app/charges-for-order/{orderId}', 'AppController@deleteOrderCharges')->where('orderId', '.*');
  1. 配置服务器允许编码斜杠:
    • Apache:在.htaccess中添加AllowEncodedSlashes On
    • Nginx:在站点配置的location /块中添加allow_encoded_slashes on;

这样/app/charges-for-order/11%2F11会被正确匹配,orderId参数值为11/11(Laravel会自动解码)。

方法二:使用替代编码/替换方案

如果不想修改服务器配置,可通过字符替换或二次编码规避:

方案A:自定义字符替换

  • 前端将斜杠替换为无冲突字符(如||):
const encodedOrderId = orderId.replace(/\//g, '||');
const url = `/app/charges-for-order/${encodedOrderId}`;
  • 后端控制器中还原斜杠:
public function deleteOrderCharges($orderId)
{
    $orderId = str_replace('||', '/', $orderId);
    // 后续业务逻辑
}

方案B:二次编码斜杠

  • 前端对encodeURIComponent生成的结果再次编码斜杠:
const encodedOrderId = encodeURIComponent(orderId).replace(/%2F/g, '%252F');
const url = `/app/charges-for-order/${encodedOrderId}`;
  • 后端控制器中解码参数:
public function deleteOrderCharges($orderId)
{
    $orderId = urldecode($orderId);
    // 后续业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:11:37