[英]Silently move api resources to another url
我已经用WepApi 2与主网站紧密结合编写api。 我决定将它与其他网络应用程序分离,以使事情更加孤立。
我遵循了以下步骤:
Creat属性将当前使用旧URL的所有用户重定向到新URL。 出于这些原因,我使用了307状态代码,因为我们应该保留用户请求的动词并请求有效负载。
var response = request.CreateResponse(HttpStatusCode.TemporaryRedirect); //307 response.Headers.Location = new Uri($"{appConfig.ApiAppDomain}" + "/" + request.RequestUri.AbsolutePath + request.RequestUri.Query); return response;
通常它很好用。 客户端获得307,然后跟随Location
标头中的URL。
问题出在这里:主要的网络应用程序是https
,新的api是http
。 当我使用邮递员时,它表现得很奇怪,并且用所有请求的身体切割用GET
请求替换POST
请求。 一点也不好奇怪因为307
不允许改变方法和有效载荷。
所以这里有几个问题:
302,301等重定向只是GET请求。但是从技术上来说,浏览器可以发出POST请求。更多细节在这里 。但是重定向不是一个好主意,它会为每个请求进行不必要的往返。也是它可能会导致其他问题,如跨域调用(如果您正在进行Ajax REST API调用或浏览器将验证所有资源仅从https加载( 混合内容警告 )
处理此https - > http重定向的最佳方法是什么?
我们不应该进行重定向,因为它可能导致许多问题,正如我上面解释的那样
它是否是一个好的解决方案?
在这种情况下,重定向不是一个好的解决方案。
将我们的用户静默移动到新api url的最佳解决方案是什么?
在我看来,这种情况下的最佳解决方案是设置一个透明代理,它也将执行https卸载。 这也将使您的客户端零变化。这就是我们如何设置它。
在IIS中为任何进入API的请求设置反向代理。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule2" stopProcessing="true"> <match url="api/(.*)" /> <action type="Rewrite" url="http://server2/api/{R:1}" logRewrittenUrl="true" /> <conditions> </conditions> </rule> </rules> </rewrite> </system.webServer> </configuration>
在上面的urlrewrite规则中,如果请求的URL包含将通过http.So的api ,那么您将把请求转发给server2,直到此服务器请求将在https上发送,并且从那里它将在http上发送到服务器2。没有客户的知识就会发生。 这将是本地请求(不是通过互联网),延迟可以忽略不计。所以流程将是这样的
浏览器=> https( https://example.com/api/products/2 )=> http( http:// server2 / api / products / 2 )
只是总结了这种方法的优点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.