Yur*_* N. 6 c# url redirect url-rewriting asp.net-core
我有简单的 url 重写器:
private static void RedirectToAPI(RewriteContext context)
{
var request = context.HttpContext.Request;
if (request.Path.Value.StartsWith("/apiendpoint", StringComparison.OrdinalIgnoreCase))
{
var json = JsonConvert.SerializeObject(request.Path.Value
.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
.Skip(1));
var response = context.HttpContext.Response;
response.Headers[HeaderNames.Location] = $"/custom";
response.StatusCode = StatusCodes.Status301MovedPermanently;
context.Result = RuleResult.EndResponse;
using (var bodyWriter = new StreamWriter(response.Body))
{
bodyWriter.Write(json);
bodyWriter.Flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当它重定向到/custom url 时,请求有方法 GET,而这个方法需要 POST。
比如发送 GET 请求到 url /apiendpoint/first/second/third,然后 rewriter 响应重定向,相应地,下面的请求必须是 POST 方法,但现在,它是 GET。
如何更改请求方法,即在 url 重写器响应之后?
编辑:啊,刚才查看了评论。如果初始请求是 GET,那么这也不起作用,并且您无法告诉浏览器进行 POST。并非没有返回一个使用 JavaScript 自动执行表单的视图。
您需要返回 308,而不是 301。
这是更改后的代码:
private static void RedirectToAPI(RewriteContext context)
{
var request = context.HttpContext.Request;
if (request.Path.Value.StartsWith("/apiendpoint", StringComparison.OrdinalIgnoreCase))
{
var json = JsonConvert.SerializeObject(request.Path.Value
.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries)
.Skip(1));
var response = context.HttpContext.Response;
response.Headers[HeaderNames.Location] = $"/custom";
response.StatusCode = 308;
context.Result = RuleResult.EndResponse;
using (var bodyWriter = new StreamWriter(response.Body))
{
bodyWriter.Write(json);
bodyWriter.Flush();
}
}
}
Run Code Online (Sandbox Code Playgroud)
308是永久重定向,需要浏览器保留该方法。https://httpstatuses.com/308
临时版本是307。
MVC Core 2.0.0-preview1 中提供了这些重定向的便捷方法。
归档时间: |
|
查看次数: |
13267 次 |
最近记录: |