-
-
Notifications
You must be signed in to change notification settings - Fork 175
Url重写
Henry edited this page Oct 24, 2019
·
12 revisions
通过Url重写可以提高Url访问友好性同时不需要调整原有服务的Url访问地址,组件在新版本针对Url重写进行的优化调整,以支持更灵活的重写功能。
可以通过HttpApiServer.UrlRewrite.Add
方法来添加Url重写规则.
server.UrlRewrite.Add("/cate/{0}.html", "/index.html");
以上重写是把/cate/
下面的所有html重写到index.html
.
如果不想通过写代码来完成,可以配置目录下的rewrite.json
文件(不存在则自行添加)
[
{
"Url": "/cate/{0}.html",
"Rewrite": "/index.html"
}
]
组件对Url重写的依据是BaseUrl
基础访问路径进行匹配,匹配方式不匹分大小写。通过{name}
来描述一个Url的可变部分,name
是一个变量名,这个变量可以在重写Url部分使用,一个Url可以有多个变量描述.这些重写的变量都会被写入到HttpContext的请求数据中,更方便绑定到控制器参数上.
- 示例一
{
"Url": "/api/customers/{count}",
"Rewrite": "/customers/{count}"
}
- 示例二
{
"Url": "/api/{user}/{id}",
"Rewrite": "/api/{user}?id={id}"
}
- 示例三
{
"Url": "/api/{user}-{id}",
"Rewrite": "/api/{user}/{id}"
}
- 官方blog
server.UrlRewrite.Add("/cate/{0}.html", "/index.html", "html")
.Add("/search/{0}.html", "/index.html", "html")
.Add("/tag/{0}.html", "/index.html", "html")
.Add("/blog/{0}.html", "/blog.html", "html")
.Add("/photos/{0}.html", "/photos.html", "html");
以上是 http://ikende.com/blog/ 的一个重写规则,把分类,标签和查询都路由到index.html
页面处理了。
静态规则有时候很难满足应用的需要,因此组件HttpRequest
提供UrlRewriteTo
方法用于重写当前的请求Url。那什么时候使用动态重写呢?以下描述一个简单的场景来表述动态重写的作用,当一个API提供了一个V1版后又开发了V2版本,但希望用户在不改变Url基础规则的情况可以兼容两种版本的调用;出现这情况一般会想到在前置代理做一些转发规则来满足需求,但组件提供动态重写则可以满足这样的需求。
[Controller(BaseUrl = "Api")]
public class Api
{
public object Hello(string name)
{
return $"hello {name} {DateTime.Now}";
}
}
[Controller(BaseUrl = "/v2/Api")]
public class ApiV2 : IController
{
public object Hello(string name)
{
return $"hello {name} {DateTime.Now} v2";
}
[NotAction]
public void Init(HttpApiServer server, string path)
{
server.HttpRequesting += (o, e) =>
{
if (e.Request.BaseUrl.IndexOf("/api", StringComparison.OrdinalIgnoreCase) >= 0)
{
if (e.Request.Data["version"] == "v2")
{
e.Request.UrlRewriteTo("/v2" + e.Request.Url);
}
}
};
}
}
只需要在实现V2版本中对HttpRequesting
进行一个监听并根据情况进行处理即可以;而V1的代码无须更改,已有的Url没有变化,只需要在新的调用中添加对应的版本描述即实现。