Я использую серверную часть .netcore и vuejs 2.
Я сгенерировал html файлов для некоторых маршрутов моего vuejs, которые я поместил прямо в папку dist
:
Я могу получить доступ к html файлам с помощью http://my-domain/en/home/index.html
, но вызов http://my-domain/en/home
(без index.html
) не будет обслуживать html файл. Вместо этого он вернет эквивалентную страницу спа.
Что я могу сделать, чтобы это исправить? Я хочу, чтобы сервер возвратил файл html, если он существует в приоритетном порядке, в противном случае верните обычный веб-сайт spa.
Вот часть моего запуска .cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
// ...
// In production, the vue files will be served from this directory
services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; });
// ...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ...
// WebRootPath == null workaround. - from https://github.com/aspnet/Mvc/issues/6688
if (string.IsNullOrWhiteSpace(env.WebRootPath))
{
env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "ClientApp", "dist");
}
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public,max-age=" + durationInSeconds;
}
});
app.UseSpaStaticFiles();
// ...
app.UseSpa(spa =>
{
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseVueCli(npmScript: "serve", port: 8085);
}
});
}
EDIT : Помимо ответа @Phil, мне нужно было предоставить FileProvider, потому что UseDefaultFiles
не смотрел в нужную папку:
app.UseDefaultFiles(new DefaultFilesOptions
{
FileProvider = new PhysicalFileProvider(env.WebRootPath) // important or it doesn't know where to look for
});
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
const int durationInSeconds = 60 * 60 * 24;
ctx.Context.Response.Headers[HeaderNames.CacheControl] =
"public,max-age=" + durationInSeconds;
},
FileProvider = new PhysicalFileProvider(env.WebRootPath) // same as UseDefaultFiles
});