【问题标题】:route defined with negative lookaround matches the route despite the negative assertion尽管有否定断言,但使用否定环视定义的路由与路由匹配
【发布时间】:2021-03-09 05:09:46
【问题描述】:

我们想打开一个DELETE 端点,允许调用所有正整数,但不允许调用 id 1(又名元素 1 不能删除)

通常打开一个允许正整数的端点我这样配置路由

delete_elements:
 path: /elements/{id}
 methods: ["DELETE"]
 controller: app.elements_delete
 requirements:
  id: '\d+'

对于这种情况,我尝试将正则表达式更改为也不允许数字 1 的正则表达式

delete_elements:
 path: /elements/{id}
 methods: ["DELETE"]
 controller: app.elements_delete
 requirements:
  id: /^(?!(?:1)$)\d+/

但是当我修改需求并调用端点时,响应是端点不存在。

“未找到“DELETE /elements/59”的路径:不允许的方法(允许:GET,PUT)”

那个正则表达式有什么问题?禁止某些值的正确方法是什么?

【问题讨论】:

  • /^(?!(?:1)$)\d+/ 正则表达式的输入是什么?
  • @yivi 建议的解决方案 id: \b1\b|(\d+) 允许删除 1。所以问题似乎不在正则表达式上。使用有效的正则表达式不会产生预期的行为。

标签: php regex symfony symfony4 symfony-routing


【解决方案1】:

尝试:

    id: '^(?!1/?$)\d+'

问题是路由被重定向到 Symfony 中以 / 结尾的 URL。所以你原来的否定前瞻不起作用,因为它正在寻找1,后跟“字符串结尾”($)。

通过将/? 添加到正则表达式中,您表示负前瞻可以是1$1/$

虽然这可行,但我的建议还是在应用程序级别处理此问题,并在有人尝试删除他们不允许删除的内容时返回 403,而不是返回意味着不同的 404。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多