Phoenix router中含正斜杠的name参数被误判为路由分段如何解决?
可以通过自定义路由参数的匹配正则来实现允许name参数包含斜杠,Phoenix默认的路由参数匹配规则是[^/]+,即不会匹配路径分隔符斜杠,修改正则规则即可突破这个限制。
实现方案
因为你当前的配置里有嵌套的/quote子路由,需要优先保证固定路由的匹配优先级,推荐的修改方式如下:
- 先手动注册所有固定路径的子路由,避免被参数路由提前匹配
- 给
resources的param选项传入二元组,自定义name参数的匹配正则为可包含任意字符(包含斜杠)
修改后的路由配置示例:
scope "/api", AppWeb do scope "/pricing" do # 优先注册固定的quote路由,优先级高于通用参数路由 get "/inventory/:name/quote", InventoryController, :quote, as: :pricing_inventory # 自定义name参数匹配规则,允许包含斜杠 resources("/inventory", InventoryController, param: {"name", ~r".+"}) end end
注意事项
- 路由是按代码书写顺序从上到下匹配的,所有固定路径的路由必须放在带通用正则参数的路由之前,否则固定路由会被参数路由覆盖
- 如果
name参数有明确的格式规则,建议缩小正则的匹配范围(比如如果name只允许字母、数字和斜杠,可以写成~r"[A-Za-z0-9/]+"),避免不必要的路由匹配风险 - 建议前端传输带特殊字符的参数值时先做URL编码,Phoenix会自动对拿到的参数值做解码,无需后端额外处理
内容的提问来源于stack exchange,提问作者William Ross
相关产品推荐
相关产品推荐

