【问题标题】:Mysterious 404 routing error caused just by using 'x' prefix?仅使用“x”前缀引起的神秘 404 路由错误?
【发布时间】:2014-09-16 20:36:43
【问题描述】:

我想让我的网址尽可能短,所以我正在测试不带分隔符的路由,如下所示:

routes.MapRoute(
   name: "Photo",
   url: "x{id}",
   defaults: new { controller = "Content", action = "Photo" }
);

由于某种原因,上面的路线不起作用,我收到 404 错误:

找不到资源。

描述:HTTP 404。您正在寻找的资源(或其之一 依赖项)可能已被删除,名称已更改,或者是 暂时不可用。

但是,当我将 x 前缀更改为不同的字母时,例如 g,它工作正常。

没有冲突的路线。请问我在这里缺少什么?

编辑:

我再次看到这个问题,并且我观察到只有当 id 包含 x 时才会发生 404,即像 /xa1B2/xZ9y8 这样的路由可以正常工作,但 @987654327 @失败。请问有什么想法吗?

【问题讨论】:

标签: c# asp.net-mvc asp.net-mvc-5 url-routing asp.net-mvc-routing


【解决方案1】:

MSDN:

您可以在分隔符之间定义多个占位符,但它们必须由一个常数值分隔。例如,{language}-{country}/{action} 是一个有效的路由模式。但是,{language}{country}/{action} 不是有效模式,因为占位符之间没有常量或分隔符。因此,路由无法确定将语言占位符的值与国家占位符的值分开的位置。

正如您已经说过的,当您的 id 以 x 开头时会发生错误。这是因为它无法分辨出您的 id 值和您选择的常量之间的差异。

您可以使用一些选项来解决此问题:

  1. 在常量和不作为任何“id”的第一个字符出现的占位符之间放置一个分隔符。
  2. 为不作为任何“id”的第一个字符出现的常量选择一个字符。
  3. 更改“id”,使其不能以x开头。
  4. 添加一个重复的路由,当“id”包含x 时,该路由有一个要绕过的约束,并以另一个字符开始第二个路由。

第 4 个选项如下所示:

// Ids that don't contain x will use this route
routes.MapRoute(
   name: "Photo_X",
   url: "x{id}",
   defaults: new { controller = "Content", action = "Photo" },
   constraints: new { id = @"(?i)[^x]" }
);

// Ids that contain x will use this route instead
routes.MapRoute(
   name: "Photo_Y",
   url: "y{id}",
   defaults: new { controller = "Content", action = "Photo" }
);

【讨论】:

    【解决方案2】:

    在创建常量值和参数之间没有分隔符的路由之前,我遇到过类似的问题。虽然我无法准确解释为什么会发生这种情况,但我不得不说它显然给你带来了多大的悲伤,为什么不多花一个字符,然后在路由中添加一个“/”或“-”:

    routes.MapRoute(
       name: "Photo",
       url: "x-{id}",
       defaults: new { controller = "Content", action = "Photo" }
    );
    

    我怀疑这两种方法都可以为您解决问题,那么 URL 上的一个额外字符究竟是什么?

    编辑:

    我有一种很好的感觉,我知道为什么会发生这种情况,但无法找到任何证据来支持它。我怀疑当您的 URL 包含另一个 x 像这样 x12xG 时,路由引擎无法确定 {id} 应该是 12xG 还是只是 G,所以它认为路由不明确并忽略它。由于您没有合适的后备路由,因此您会得到 404。

    根据我的评论,如果您可以使用路由约束来限制 {id} 使用正则表达式的允许值,您也许可以解决这个问题。我认为你最好的选择是如果{id} 始终是一个固定长度的字符串,那么你的约束可以强制执行它,它可能会为你带来匹配。

    【讨论】:

    • +1 为您的建议 威尔,这肯定会奏效.. 但我仍然想看看无分隔符路由是否是一种方法(或者至少了解什么是根本原因行为描述)
    • 如果您可以计算出满足 id 字段可能值的正则表达式,您可以尝试添加路由约束吗? asp.net/mvc/overview/older-versions-1/controllers-and-routing/…
    • 添加约束出人意料地没有帮助。我最终将所有 4 个字符长的 URL 路由到我的操作。无论如何,感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2017-05-12
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多