IIS Url 重写 returns 404 错误
IIS Url Rewrite returns 404 error
我有一个 IIS 站点重写了 URLs 以对我们的 API 用户隐藏端口(不是我的选择)。换句话说,主端将url重写到同一台机器上的不同站点。
所以如果我访问(11001端口只是为了测试,最终会在80端口):
http://apitest.mycompany.com:11001/v1/accounts
http://apitest.mycompany.com:11001/v1/swagger/docs/accounts
我想重写 return 来自(分别)的结果:
http://apitest.mycompany.com:9600/v1/accounts
http://apitest.mycompany.com:9600/v1/swagger/docs/accounts
这里只有一个重写规则在起作用,但是当第二个 URL 被重写并正确 return 时,第一个会产生 404 错误。
我可以直接访问两个重写的链接,它们都可以使用。我还可以根据完全相同的有效规则进行临时重定向。
我的重写规则如下所示:
Match
- regex, ignore case: .*/accounts.*
Action
- Rewrite
- URL: 'http://apitest.mycompany.com:9600/{R:0}'
- Append query string: true
- Stop processing of subsequent rules: true
我一直在查看失败的重写日志文件,但看不出问题所在:
经过两天写了所有可以想到的重写规则组合,我终于发现了这个与规则无关的问题。
问题出在我的 RouteConfig
上。它被保留为默认值:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
意味着任何包含少于 4 个路径元素的路由都会被 ASP.NET 路由捕获,而不是 URL 重写。我希望其他人可以详细说明为什么会这样,但是顺序似乎是:
Redirect > ASP Routing > Rewrite
我希望其他人可以使用这个答案,因为这让我工作了整整两天。
我有一个 IIS 站点重写了 URLs 以对我们的 API 用户隐藏端口(不是我的选择)。换句话说,主端将url重写到同一台机器上的不同站点。
所以如果我访问(11001端口只是为了测试,最终会在80端口):
http://apitest.mycompany.com:11001/v1/accounts
http://apitest.mycompany.com:11001/v1/swagger/docs/accounts
我想重写 return 来自(分别)的结果:
http://apitest.mycompany.com:9600/v1/accounts
http://apitest.mycompany.com:9600/v1/swagger/docs/accounts
这里只有一个重写规则在起作用,但是当第二个 URL 被重写并正确 return 时,第一个会产生 404 错误。
我可以直接访问两个重写的链接,它们都可以使用。我还可以根据完全相同的有效规则进行临时重定向。
我的重写规则如下所示:
Match
- regex, ignore case: .*/accounts.*
Action
- Rewrite
- URL: 'http://apitest.mycompany.com:9600/{R:0}'
- Append query string: true
- Stop processing of subsequent rules: true
我一直在查看失败的重写日志文件,但看不出问题所在:
经过两天写了所有可以想到的重写规则组合,我终于发现了这个与规则无关的问题。
问题出在我的 RouteConfig
上。它被保留为默认值:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
意味着任何包含少于 4 个路径元素的路由都会被 ASP.NET 路由捕获,而不是 URL 重写。我希望其他人可以详细说明为什么会这样,但是顺序似乎是:
Redirect > ASP Routing > Rewrite
我希望其他人可以使用这个答案,因为这让我工作了整整两天。