为什么 X-Forwarded-Proto 在 Elastic Beanstalk 上总是设置为 HTTP?
Why is X-Forwarded-Proto always set to HTTP on Elastic Beanstalk?
设置
你好。我正在将 ASP.Net 核心应用程序部署到 AWS Elastic Beanstalk。我 运行 使用的平台是 64 位 Amazon Linux 2/2.1.5,使用 Nginx 作为代理服务器软件。我在环境配置中为我的负载均衡器设置了一对监听器。它们的设置如下:
Port=443 Protocol=HTTPS SSL=certificate Process=default
Port=80 Protocal=HTTP Process=default
我只有一个进程:
Name=default Port=80 Protocol=HTTPS
问题
在我的 ASP.Net 核心服务器上,我正在尝试检查服务器的原始客户端是通过 HTTPS 还是 HTTP 进行通信。据我了解,请求的 X-Forwarded-Proto
header 应包含此信息。但是,无论客户端如何连接到服务器,X-Forwarded-Proto
的值始终是 http
。 为什么 X-Forwarded-Proto
从未设置为 https
,即使从我的网络浏览器连接时也是如此?
在此先感谢您的帮助!
正如@MarkB 指出的那样,问题出在 Nginx 配置中。 AWS Elastic Beanstalk 在 /etc/nginx/conf.d/elasticbeanstalk
中有一个默认配置文件 00_application.conf
,这是罪魁祸首。它有一个声明:
proxy_set_header X-Forwarded-Proto $scheme;
需要更改为:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
为了覆盖这个文件,我使用了这里详述的方法:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html。
我在已部署项目的根目录中添加了一个文件 .platform/nginx/conf.d/elasticbeanstalk
。它包含:
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
}
我还必须向我的 ASP.Net 核心应用程序添加一个中间件,以使用转发的 headers,如该答案中所述:Redirect URI sent as HTTP and not HTTPS in app running HTTPS.
我在 Startup.cs
中添加了以下内容:
public void ConfigureServices(IServiceCollection services)
{
//...
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
//...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.UseForwardedHeaders();
//...
}
我希望这对其他人有帮助!
设置
你好。我正在将 ASP.Net 核心应用程序部署到 AWS Elastic Beanstalk。我 运行 使用的平台是 64 位 Amazon Linux 2/2.1.5,使用 Nginx 作为代理服务器软件。我在环境配置中为我的负载均衡器设置了一对监听器。它们的设置如下:
Port=443 Protocol=HTTPS SSL=certificate Process=default
Port=80 Protocal=HTTP Process=default
我只有一个进程:
Name=default Port=80 Protocol=HTTPS
问题
在我的 ASP.Net 核心服务器上,我正在尝试检查服务器的原始客户端是通过 HTTPS 还是 HTTP 进行通信。据我了解,请求的 X-Forwarded-Proto
header 应包含此信息。但是,无论客户端如何连接到服务器,X-Forwarded-Proto
的值始终是 http
。 为什么 X-Forwarded-Proto
从未设置为 https
,即使从我的网络浏览器连接时也是如此?
在此先感谢您的帮助!
正如@MarkB 指出的那样,问题出在 Nginx 配置中。 AWS Elastic Beanstalk 在 /etc/nginx/conf.d/elasticbeanstalk
中有一个默认配置文件 00_application.conf
,这是罪魁祸首。它有一个声明:
proxy_set_header X-Forwarded-Proto $scheme;
需要更改为:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
为了覆盖这个文件,我使用了这里详述的方法:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html。
我在已部署项目的根目录中添加了一个文件 .platform/nginx/conf.d/elasticbeanstalk
。它包含:
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
}
我还必须向我的 ASP.Net 核心应用程序添加一个中间件,以使用转发的 headers,如该答案中所述:Redirect URI sent as HTTP and not HTTPS in app running HTTPS.
我在 Startup.cs
中添加了以下内容:
public void ConfigureServices(IServiceCollection services)
{
//...
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
//...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
app.UseForwardedHeaders();
//...
}
我希望这对其他人有帮助!