asp.net X-Forwarded-For 和 X-Forwarded-Proto 之间的核心参数计数不匹配
asp.net core Parameter count mismatch between X-Forwarded-For and X-Forwarded-Proto
CloudFlare
IIS ARR
Asp.net core 1.1.1
我在cloudflare后面,然后在iis arr后面。
cloudflare 处于仅 http 模式
我不断收到
Parameter count mismatch between X-Forwarded-For and
X-Forwarded-Proto.
我的启动文件
ForwardedHeadersOptions forwardOption = new ForwardedHeadersOptions
{
ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto,
ForwardLimit = 2
};
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
app.UseForwardedHeaders(forwardOption);
并且我已经在 iis arr 级别设置了这个重写规则我也测试了 https
HTTP_X_FORWARDED_PROTO
http
replace the existing value
有什么问题?
这里有一个 link 但没有帮助
我找到了一个解决方案,只需将这段代码添加到您的配置服务中
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.RequireHeaderSymmetry = false;
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
});
如果你在 cloudflare 和 arr
public string GetRealIpAddress()
{
StringValues connectionIp;
var conncetionIpAvailable = Request.Headers.TryGetValue("Cf-Connecting-Ip", out connectionIp);
if (conncetionIpAvailable)
{
return connectionIp.ToString().Trim();
}
else
{
var xForwardFor = Request.Headers.GetCommaSeparatedValues("X-Forwarded-For");
string ipList = "";
foreach (var x in xForwardFor)
{
ipList = ipList.Trim() + " , " + x.Trim();
}
if (!string.IsNullOrEmpty(ipList.Trim()))
{
return ipList.Trim();
}
else
{
return "xxx.xxx.xxx.xxx";
}
}
}
CloudFlare
IIS ARR
Asp.net core 1.1.1
我在cloudflare后面,然后在iis arr后面。
cloudflare 处于仅 http 模式
我不断收到
Parameter count mismatch between X-Forwarded-For and X-Forwarded-Proto.
我的启动文件
ForwardedHeadersOptions forwardOption = new ForwardedHeadersOptions
{
ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto,
ForwardLimit = 2
};
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
app.UseForwardedHeaders(forwardOption);
并且我已经在 iis arr 级别设置了这个重写规则我也测试了 https
HTTP_X_FORWARDED_PROTO
http
replace the existing value
有什么问题?
这里有一个 link 但没有帮助
我找到了一个解决方案,只需将这段代码添加到您的配置服务中
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.RequireHeaderSymmetry = false;
options.ForwardLimit = 2;
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
});
如果你在 cloudflare 和 arr
public string GetRealIpAddress()
{
StringValues connectionIp;
var conncetionIpAvailable = Request.Headers.TryGetValue("Cf-Connecting-Ip", out connectionIp);
if (conncetionIpAvailable)
{
return connectionIp.ToString().Trim();
}
else
{
var xForwardFor = Request.Headers.GetCommaSeparatedValues("X-Forwarded-For");
string ipList = "";
foreach (var x in xForwardFor)
{
ipList = ipList.Trim() + " , " + x.Trim();
}
if (!string.IsNullOrEmpty(ipList.Trim()))
{
return ipList.Trim();
}
else
{
return "xxx.xxx.xxx.xxx";
}
}
}