我有一个使用 Kestrel 在 Linux 上运行的 asp .net core 应用程序。
它绑定到端口 80 上的 ip ok。
但是 nginx 反向代理站点需要将应用程序托管在非根路径下,例如
所以这没关系,应用程序加载,但应用程序不知道 myapp 路径 - 因此尝试从根加载内容路径资源。 因此 css 资源等不会加载。
如何在运行时理想地配置应用程序以了解 url 路径。
更新:
我发现在 Startup.configure 中使用 app.UsePathBase("/myapp"); 有帮助,因为应用程序将处理此路径上的请求,但静态文件请求是 /myapp/images/example.jpg ,它返回 404。
图像文件夹位于 wwwroot 中 - 据我所知,这是 UseStaticFiles 的默认文件夹。
我希望请求能够理解 /myapp 实际上是虚拟的。
好的 - 所以必须做两件事才能让应用程序在“虚拟目录”下运行:
在启动配置方法中,我必须设置应用程序的基本路径并指定静态文件的路径。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseStaticFiles("/myapp");
app.UsePathBase("/myapp");
...
}
该应用程序也从 / 运行 - 不确定这是否可取,但现在对我来说不是一个大问题。
对于我(使用.NET Core 3.1)来说有点不同,使用 ScottC 的答案它无法找到静态文件,因为它在 my-app 目录的根目录中查找,而不是在 my-app/wwwroot 中
这个配置在 Startup.cs 中对我有用:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
if (env.IsDevelopment())
{
...
}
else
{
...
app.UsePathBase("/my-app");
}
app.UseStaticFiles();
...
}
斯科特C,
一旦您的网页内容位于 wwwroot 下,您必须在 Startup 类的配置部分添加 app.UseStaticFiles() 。
请参阅下面的示例:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
}
希望对您有帮助。
除了设置
app.UsePathBase("/my-app");
之外,我要做的就是向Program
添加一行:
public static void Main(string[] args)
{
CreateHostBuilder(args)
#if !DEBUG
.UseContentRoot(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
#endif
.Build().Run();
}
对于 Net8,我发现:
将
UsePathBase()
放在路由和映射之前意味着您不需要更改 UseStaticFiles()
或其他任何内容。
app.UsePathBase("/myapp"); //<- must go before UseRouting()
app.UseRouting();
app.Map...()
对于 Blazor,您也想要;
app.MapBlazorHub("/myapp");
并编辑您的
App.razor
(对于 Net8 或更高版本)或 _Host.cshtml
(对于 Net 7)基础:
<!-- here you must have a trailing slash whereas in Program.cs you need to not have a trailing slash-->
<base href="/myapp/" />
Blazor 应用程序基本路径的 MS 文档(恕我直言,不是很清楚):https://learn.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/?view=aspnetcore-8.0&tabs=视觉工作室#app-base-path