Asp.Net core 3.0中的URL重写

3
在 .Net Core web API 中,我想使端点能够双向工作,例如:/api/order/order
因此,我尝试了很多正则表达式模式来重写URL以排除 "api",但没有成功。在启动配置中:
var rewrite = new RewriteOptions()
       .AddRewrite("^(?!api\\/).*$", "/api/$1", true)
       .AddRedirectToHttps();
 app.UseRewriter(rewrite);

我认为我的方法可能是错误的。
订单控制器:
    [Route("api/[controller]")]
    [ApiController]
    public class OrderController : ControllerBase
    {

1
尝试使用.AddRewrite("^(?:api/)?", "api/", true) - Wiktor Stribiżew
不行,没有成功。@WiktorStribiżew - G.Anıl Yalçın
1
这意味着您想要的不仅仅是将所有请求重定向到“/api/…”,对吗?如果您需要正则表达式方面的帮助,请解释需要用什么替换。 - Wiktor Stribiżew
任何端点都应该像订单端点一样双向工作,例如:/api/order或者/order。因此,我需要替换所有请求中的/api/<其余请求>,除非它已经包含了/api - G.Anıl Yalçın
1
那么我的建议应该有效,但有一个问题:当URL为/api时。如果是这种情况,请用^(?:api(?:/|$))?替换^(?:api/)? - Wiktor Stribiżew
1
或者,.AddRewrite("^(?:api(/|$))?", "api$1", true) - Wiktor Stribiżew
2个回答

1
为什么不使用两个Route属性代替单个属性...
[Route("api/[controller]")]
[Route("[controller]")]
public class OrderController : ControllerBase

可以使用这种方法,甚至可以设置一个基本控制器类,带有这些属性,以后就不必再处理了(我想)


我可以尝试,但是我有一个健康检查中间件 app.UseHealthChecks("/api/health"); ,它没有控制器。它必须与其他中间件以相同的方式工作。所以这不是一个选项。无论如何,感谢您的建议。 - G.Anıl Yalçın

1

经过多次尝试,我终于找到了答案。要是正则表达式能更容易一些就好了。

.AddRewrite("^(?!api\\/)(.*)$", "api/$1", true)

.* 需要放在括号内,而 rewrite value 不需要前导斜杠。

本文 中的正则表达式示例让我找到了自己的方法。

为了理解重写器背后的内容,我需要添加另一个中间件来记录传入的 HTTP 请求。这篇文章 是一个很好的参考。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接