在Apache部署ASP.NET Core应用后URL显示端口问题求助
我已将ASP.NET Core网站部署在Apache服务器上,目前遇到的问题是浏览器URL中会显示端口,即实际显示为https://mywebsite.com:5001/,而非预期的https://mywebsite.com。
我的Kestrel配置了两个端口:
"Kestrel": { "Endpoints": { "MyHttpEndpoint": { "Url": "http://localhost:5000" }, "MyHttpsEndpoint": { "Url": "https://localhost:5001" } } }
同时在program.cs中添加了重定向中间件:
app.UseHttpsRedirection();
应用运行正常,但访问mywebsite.com时,浏览器自动跳转到带5001端口的地址,Chrome网络面板显示重定向至https://mywebsite.com:5001。我的Apache虚拟主机配置如下:
<VirtualHost *:80> ProxyPreserveHost On ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ ServerName mywebsite.com ServerAlias *.mywebsite.com ErrorLog C:/xampp/apache/logs/error.log #CustomLog C:/xampp/apache/logs/access.log </VirtualHost> <VirtualHost *:443> Protocols h2 http/1.1 ProxyPreserveHost On ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ ServerName mywebsite.com ServerAlias *.mywebsite.com ErrorLog C:/xampp/apache/logs/error.log #CustomLog C:/xampp/apache/logs/access.log SSLEngine on SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder off SSLCompression off SSLSessionTickets on SSLUseStapling off SSLCertificateFile C:/xampp/htdocs/aspnetcore/server.crt SSLCertificateKeyFile C:/xampp/htdocs/aspnetcore/server.key SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 </VirtualHost>
核心原因
UseHttpsRedirection中间件默认读取Kestrel配置的HTTPS端口(此处为5001)生成重定向地址,但Apache作为反向代理已处理HTTPS(443端口),ASP.NET Core无法感知外部请求的实际端口,因此返回带5001的重定向地址。
修复步骤
1. 配置Apache传递代理头信息
在两个Apache虚拟主机配置中添加代理头,告知ASP.NET Core外部请求的协议和端口:
80端口虚拟主机修改后:
<VirtualHost *:80> ProxyPreserveHost On ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ # 添加代理头 RequestHeader set X-Forwarded-Proto "http" RequestHeader set X-Forwarded-Port "80" ServerName mywebsite.com ServerAlias *.mywebsite.com ErrorLog C:/xampp/apache/logs/error.log #CustomLog C:/xampp/apache/logs/access.log </VirtualHost>
443端口虚拟主机修改后:
<VirtualHost *:443> Protocols h2 http/1.1 ProxyPreserveHost On ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ # 添加代理头 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" ServerName mywebsite.com ServerAlias *.mywebsite.com ErrorLog C:/xampp/apache/logs/error.log #CustomLog C:/xampp/apache/logs/access.log SSLEngine on SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder off SSLCompression off SSLSessionTickets on SSLUseStapling off SSLCertificateFile C:/xampp/htdocs/aspnetcore/server.crt SSLCertificateKeyFile C:/xampp/htdocs/aspnetcore/server.key SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 </VirtualHost>
2. 让ASP.NET Core信任代理头
在program.cs中添加转发头配置,确保应用信任Apache传递的代理信息:
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedPort; // 允许本地回环地址作为代理(Apache在本机) options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); });
并在UseHttpsRedirection之前启用转发头:
var app = builder.Build(); // 必须在UseHttpsRedirection之前调用 app.UseForwardedHeaders(); app.UseHttpsRedirection(); // 其他中间件配置...
3. 可选:显式指定HTTPS重定向端口
若上述配置仍未解决问题,可直接在program.cs中指定重定向端口为443:
builder.Services.AddHttpsRedirection(options => { options.HttpsPort = 443; });
验证
修改配置后,重启Apache和ASP.NET Core应用,访问http://mywebsite.com应自动重定向至https://mywebsite.com,不再显示5001端口。
内容的提问来源于stack exchange,提问作者yogihosting

