【导读】 近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对你能有所帮助

内网环境跟外网隔离,现在外网的请求都需要一个专用服务器转接到内网处理,用app.UseRewriter转接, 从外网服务器转发到内网服务器的时候Header 里面的Authorization居然丢失了,重新设置RewriteContext.HttpContex Header也不行,有没有办法解决?

当时我的想法是,实在不行,在外网将token直接放到url或body里不就完事,这样的话,外网每增加一个接口,都得将token取出然后进行转换,内网以相同方式获取,这是小伙伴所不能忍受。

这里我们创建两个Web应用程序,然后添加自定义转发规则。首先我们在第一个Web应用程序创建针对如下接口请求转发规则

public class RewriteForwardRules
    public static void RedirectRequests(RewriteContext context)
        var request = context.HttpContext.Request;
        if (request.Path.Value.StartsWith("/api/forward", StringComparison.OrdinalIgnoreCase))
            var response = context.HttpContext.Response;
            response.Headers[HeaderNames.Location] = "http://localhost:8091/api/custom";
            context.Result = RuleResult.EndResponse;
 

然后在startup中注入我们自定义转发规则

app.UseRewriter(new RewriteOptions().Add(RewriteForwardRules.RedirectRequests));
 

当然,如果URL(GET请求)或Body(POST请求)中包含其他参数,将其对应转发写入URL或Body即可,这里token已存储在请求头中,所以我们直接转发请求即可

接下来我们通过Postman模拟外网发出如下POST请求

紧接着,我们在第二个Web应用程序中来接收转发请求,并获取token信息

[HttpPost]
public IActionResult Custom()
    var token = Request.Headers[HeaderNames.Authorization].ToString();
    return Ok(token);
 

然后我们一运行,发现结果都没转发到对应内网应用程序,这是为何呢?

状态码(308)设置

事实上,转发请求涉及到资源重分配指向另一URL问题,当然我们需要注意的是,既然是转发请求,势必转发者和接受者请求方式必须一致,要不然肯定不行。所以我们必须显式指定重定向状态码,设置为308,如下:

针对状态码308的意思,我们可以参看.NET Core中对于状态码枚举解释:永久重定向,原始请求方式和目标请求方式必须一致,支持原始请求和目标请求同为GET或POST。

.NET Core中关于此状态码的解释并不那么详细,我们来到专对状态码官方解释(https://httpstatuses.com/308),这里我贴下谷歌翻译后的中文

308永久重定向:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。

具有链接编辑功能的客户端应在可能的情况下自动将对有效请求URI的引用重新链接到服务器发送的一个或多个新引用。

服务器应在响应中生成一个Location头字段,其中包含新的永久URI的首选URI引用。用户代理可以使用位置字段值进行自动重定向。服务器的响应有效负载通常包含简短的超文本注释,其中包含指向新URI的超链接。

默认情况下,308响应可缓存;即,除非方法定义或显式缓存控制

状态码(301)设置

我们也可以指定响应状态码为301,

response.StatusCode = 301;
 

当然此时内网接收程序必须改为GET,如下:

301永久移动:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。

那么状态码301和308到底有何区别呢?‍‍301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST‍‍

???? 请求转发时注意设置状态码为301或308

???? 301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST

???? 基于以上所述,请求转发推荐使用状态码308

冒个泡,近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对后续可能有需要的你能有所参考和帮助。 请求转发问题 内网环境跟外网隔离,现在外网的请求都需要一个专用服务器转接到内网处理,用app.UseRewriter转接, 从外网服务器转发到内网服务器的时候Header 里面的Authorization 居然丢失了,重新设置RewriteContext.HttpContex Header也不行,有没有办法解决?当时我的想法是,实在不行,在外网将token直接放到url或body里不就完事,这样的话,外网每增加一个接口,都得将token WPF 项目迁移到.Net Core中时居然出了一堆问题...(很无语)今天在使用的时候居然发现Process.Start居然打不开Url链接了? 报 找不到指定文件 的异常?!一、bug重现首先以.Net Core 3.1框架 中一个Console项目 打开百度为例: 运行然后你就会得到: 纳闷的是,这种方法打开Url在.Net Framework中是没问题的.. 二、解决方法方案一:使用win... 一句话概括原理: 请求转发会导致功能模块的地址依然是注册的页面,只是展示的内容是其他页面的内容,刷新页面时重载的不是其他页面,而是注册的页面,就会导致注册页面中所有的方法——包括新增用户会被重复执行。 请求转发时,页面内容是showUser(新页面)的内容,但是地址栏还是saveUser(旧页面)的地址,此时执行页面刷新时,地址栏是旧页面的地址,就会被重复进入saveUser,而此时请求头中依然存在表单提交的数据,就会导致数据重复提交 doGet不会提示,直接重复提交数据 doPos.. 前言DNS Rebinding是一个比较早就出现的漏洞,本人也是在最近的一些CTF比赛的web题见识到,便记录学习一下相关的内容DNSDNS是Domain Name Service的缩写... 1.一个请求过来,首先得走完 过滤器链,才执行 请求ur资源 2.如果在这个过程中 出现了请求转发,那么等于 在这个过滤器方法调用了servlet的方法,servlet方法执行完还是在这个过滤器,继续往下执行,简单来说就是 这个 过滤器方法调用一个servlet方法,仅此而已 3.如果 在这个过滤器方法中,请求重定向,那么就是重新发一次请求,又会 重新从 过滤器链的 头走到 尾 4.例如在,springsecurity的 自定义 formLogin 页面 http.formLogin()// 开启表单认证 咨询区 jackmusick:我想禁掉浏览器缓存,这样我的client端每次都能看到server端的最新内容,在 asp.net 时代可以这么写。 publicclassNoCache... "commandName": "Project", "launchBrowser": true, "commandLineArgs": "--urls=\"http://*:5000\" ", "launchUrl": "swagger", "environmentVariables": { "ASPNETCORE_ENVI. 所谓URL重写指的是更改当前执行的URL,将其指向另外的URL以继续处理当前请求或重定向到外部URL。在ASP.NET中我们可以使用HttpContext.RewritePath方法,但在.NET Core中它并不存在。下面我我们将学习重写和重定向之间的区别,和何时以及如何在ASP.NET Core 中使用它们。 实际开发中,常见的重写URL场景有如下四种: 跳转到旧内容; 创建好看的URL; 需要处理其他URL的内容; 作为应用程序代码的一部分从一个操作重定向到另一个操作。 前两个非常简单,它们是简单 应用场景:本服务将请求转发到其他服务器,将结果返回 浏览器请求https://192.168.0.199:7000/demo1/examine/pulse 希望请求转发https://192.168.0.199:7004/demo2/examine/pulse 1.请求转发:资源进行跳转的一种方式 当客户端发送请求请求服务端某个资源的时候,这个资源处理不了请求,会把这个请求交给其他服务器内部的其他资源处理这个请求请求转发的特点: 1.浏览器只会发送一次请求 2.浏览器地址栏不会发生变化 3.请求转发的时候只能跳转到服务器内部的资源(不能跳转到服务以外的资源) 例子代码如下: package com.swlz.response; import javax.servlet.ServletExcep 1、netfilter:一个网络数据包处理框架,工作在Linux内核。在数据包的处理路径上的特定位置触发对应的条件(四表五链:4table 5chain) 2、iptables:netfilter的命令行工具,用于在四表五链上配置规则(集合),来实现防火墙功能。 context.Response.ContentType = "text/plain; charset=utf-8"; -------此方法只能输出文本 Response.WriteAsync("<script>alert('添加品牌成功!');location.href='/ProductInfos/ShowProduct';</s... 1. 先安装SDK及运行环境, 无需安装IIS, 因为他不在IIS上运行。(3). 点击确定, 将会上面选定的文件夹下生成发布文件, 大概如下。如果提示以下内容表示你的环境没有安装成功, 根据提示的链接安装即可。文件夹下会有和你项目对应的一个Client.exe文件, 运行他。4. 运行文件下的项目名称.exe文件。下载后安装.直接下一步..安装即可。(2). 发布的本地文件夹路径。3. 将发布内容复制到服务器上。(1). 选择Folder。