Обслуживание сервировки c index. html из папки spa - PullRequest
4 голосов
/ 24 апреля 2020

Я использую серверную часть .netcore и vuejs 2.

Я сгенерировал html файлов для некоторых маршрутов моего vuejs, которые я поместил прямо в папку dist:

enter image description here

Я могу получить доступ к 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
});

1 Ответ

2 голосов
/ 27 апреля 2020

Вы должны указать серверу использовать Файлы по умолчанию

При UseDefaultFiles запросы к папке ищут:

default.htm
по умолчанию. html
index.htm
index. html

app.UseDefaultFiles(); // this must come first
app.UseStaticFiles(...

Это в основном устанавливает перехватчик для запросов к папке (например, ваш en/home) и, если он найдет любое из указанных выше имен файлов, перепишет URL-адрес на folder/path/{FoundFilename}.

Если вы хотите избежать поиска чего-либо, кроме index.html, вы можете настроить его

DefaultFilesOptions options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(options);

Обратите внимание на важную информацию о заказе

Важно

UseDefaultFiles необходимо вызвать до UseStaticFiles обслуживать файл по умолчанию. UseDefaultFiles - это средство перезаписи URL, которое фактически не обслуживает файл. Включите Stati c File Middleware через UseStaticFiles для обслуживания файла.

...