ASP.NET Core の静的ファイルStatic files in ASP.NET Core

作成者: Rick Anderson および Kirk LarkinBy Rick Anderson and Kirk Larkin

HTML、CSS、画像、JavaScript などの静的ファイルは、既定では ASP.NET Core アプリにより直接クライアントに提供される資産です。Static files, such as HTML, CSS, images, and JavaScript, are assets an ASP.NET Core app serves directly to clients by default.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

静的ファイルの提供Serve static files

静的ファイルは、プロジェクトの Web ルート ディレクトリ内に格納されています。Static files are stored within the project's web root directory. 既定のディレクトリは {content root}/wwwroot ですが、UseWebRoot メソッドを使用して変更できます。The default directory is {content root}/wwwroot, but it can be changed with the UseWebRoot method. 詳細については、「コンテンツ ルート」および「Web ルート」を参照してください。For more information, see Content root and Web root.

CreateDefaultBuilder メソッドでは、コンテンツのルートが現在のディレクトリに設定されます。The CreateDefaultBuilder method sets the content root to the current directory:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

上記のコードは、Web アプリ テンプレートを使用して作成されました。The preceding code was created with the web app template.

静的ファイルには、Web ルートに対する相対パスを使用してアクセスできます。Static files are accessible via a path relative to the web root. たとえば、Web アプリケーション プロジェクト テンプレートでは、wwwroot フォルダー内に次のいくつかのフォルダーが含まれています。For example, the Web Application project templates contain several folders within the wwwroot folder:

  • wwwroot
    • css
    • js
    • lib

wwwroot/images フォルダーを作成し、wwwroot/images/MyImage.jpg ファイルを追加する場合を考えてみます。Consider creating the wwwroot/images folder and adding the wwwroot/images/MyImage.jpg file. images フォルダー内のファイルにアクセスするための URI 形式は https://<hostname>/images/<image_file_name> です。The URI format to access a file in the images folder is https://<hostname>/images/<image_file_name>. たとえば、https://localhost:5001/images/MyImage.jpgFor example, https://localhost:5001/images/MyImage.jpg

Web ルート内のファイルの提供Serve files in web root

既定の Web アプリ テンプレートでは、Startup.Configure 内で UseStaticFiles メソッドが呼び出されます。これにより、静的ファイルを提供できるようになります。The default web app templates call the UseStaticFiles method in Startup.Configure, which enables static files to be served:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

UseStaticFiles メソッドのパラメーターなしのオーバーロードによって、Web ルート内のファイルが提供可能とマークされます。The parameterless UseStaticFiles method overload marks the files in web root as servable. 次のマークアップは、wwwroot/images/MyImage.jpg を参照します。The following markup references wwwroot/images/MyImage.jpg:

<img src="~/images/MyImage.jpg" class="img" alt="My image" />

上記のコードでは、チルダ文字 ~/Web ルートを指します。In the preceding code, the tilde character ~/ points to the web root.

Web ルート外のファイルの提供Serve files outside of web root

提供する静的ファイルが Web ルートの外にあるディレクトリ階層について考えます。Consider a directory hierarchy in which the static files to be served reside outside of the web root:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • red-rose.jpg

静的ファイル ミドルウェアを次のように構成すると、要求で red-rose.jpg ファイルにアクセスできます。A request can access the red-rose.jpg file by configuring the Static File Middleware as follows:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

前述のコードでは、MyStaticFiles ディレクトリ階層は、StaticFiles URI セグメントでパブリックに公開されています。In the preceding code, the MyStaticFiles directory hierarchy is exposed publicly via the StaticFiles URI segment. https://<hostname>/StaticFiles/images/red-rose.jpg の要求は、red-rose.jpg ファイルを提供します。A request to https://<hostname>/StaticFiles/images/red-rose.jpg serves the red-rose.jpg file.

次のマークアップは、MyStaticFiles/images/red-rose.jpg を参照します。The following markup references MyStaticFiles/images/red-rose.jpg:

<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />

HTTP 応答ヘッダーの設定Set HTTP response headers

StaticFileOptions オブジェクトを使用すると、HTTP 応答ヘッダーを設定できます。A StaticFileOptions object can be used to set HTTP response headers. Web ルートから提供される静的ファイルの構成に加えて、次のコードで Cache-Control ヘッダーを設定します。In addition to configuring static file serving from the web root, the following code sets the Cache-Control header:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    const string cacheMaxAge = "604800";
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            // using Microsoft.AspNetCore.Http;
            ctx.Context.Response.Headers.Append(
                 "Cache-Control", $"public, max-age={cacheMaxAge}");
        }
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

以下のように、静的ファイルは 600 秒間パブリックにキャッシュ可能です。Static files are publicly cacheable for 600 seconds:

Cache-Control ヘッダーが追加された応答ヘッダー

静的ファイルの承認Static file authorization

静的ファイル ミドルウェアでは、承認の確認は行いません。The Static File Middleware doesn't provide authorization checks. wwwroot の下にあるものも含め、このミドルウェアによって提供されるすべてのファイルは、一般に公開されます。Any files served by it, including those under wwwroot, are publicly accessible. 承認に基づいてファイルを提供するには:To serve files based on authorization:

  • wwwroot や既定の静的ファイル ミドルウェアがアクセスできる任意のディレクトリの外にそれらを配置します。Store them outside of wwwroot and any directory accessible to the default Static File Middleware.

  • UseAuthorization の後に UseStaticFiles を呼び出し、パスを指定します。Call UseStaticFiles after UseAuthorization and specify the path:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
    
        app.UseHttpsRedirection();
    
        // wwwroot css, JavaScript, and images don't require authentication.
        app.UseStaticFiles();   
    
        app.UseRouting();
    
        app.UseAuthentication();
        app.UseAuthorization();
    
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(
                         Path.Combine(env.ContentRootPath, "MyStaticFiles")),
            RequestPath = "/StaticFiles"
        });
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
    

    上記の方法では、ユーザーの認証が必要です。The preceding approach requires users to be authenticated:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
    
        public IConfiguration Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();
    
            services.AddRazorPages();
    
            services.AddAuthorization(options =>
            {
                options.FallbackPolicy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
            });
        }
    
        // Remaining code ommitted for brevity.
    

    すべてのユーザーの認証をグローバルに要求する方法の詳細については、「認証されたユーザーを要求する」を参照してください。For information on how to globally require all users to be authenticated, see Require authenticated users.

承認に基づいてファイルを提供する別の方法:An alternative approach to serve files based on authorization:

  • wwwroot や静的ファイル ミドルウェアがアクセスできる任意のディレクトリの外にファイルを配置します。Store them outside of wwwroot and any directory accessible to the Static File Middleware.

  • 承認が適用されるアクション メソッドを使用して提供し、FileResult オブジェクトを返します。Serve them via an action method to which authorization is applied and return a FileResult object:

    [Authorize]
    public IActionResult BannerImage()
    {
        var filePath = Path.Combine(
            _env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");
    
        return PhysicalFile(filePath, "image/jpeg");
    }
    

ディレクトリ参照Directory browsing

ディレクトリ参照を使用すると、指定したディレクトリ内のディレクトリを一覧表示できます。Directory browsing allows directory listing within specified directories.

ディレクトリ参照は、セキュリティ上の理由から既定で無効になっています。Directory browsing is disabled by default for security reasons. 詳細については、「注意事項」を参照してください。For more information, see Considerations.

ディレクトリ参照を有効にするには、次のメソッドを使用します。Enable directory browsing with:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDirectoryBrowser();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

上記のコードでは、URL https://<hostname>/MyImages が使用され、各ファイルおよびフォルダーへのリンクを含む wwwroot/images フォルダーのディレクトリが参照できるようになります。The preceding code allows directory browsing of the wwwroot/images folder using the URL https://<hostname>/MyImages, with links to each file and folder:

ディレクトリ参照

既定のドキュメントの提供Serve default documents

既定のページを設定すると、サイトのビジターの開始点になります。Setting a default page provides visitors a starting point on a site. 完全修飾 URI を使用せずに wwwroot から既定のページを提供するには、UseDefaultFiles メソッドを呼び出します。To serve a default page from wwwroot without a fully qualified URI, call the UseDefaultFiles method:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseDefaultFiles();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

既定のファイルを提供するには、UseStaticFiles の前に UseDefaultFiles が呼び出される必要があります。UseDefaultFiles must be called before UseStaticFiles to serve the default file. UseDefaultFiles は、ファイルを提供しない URL リライターです。UseDefaultFiles is a URL rewriter that doesn't serve the file.

UseDefaultFiles を使用すると、wwwroot 内のフォルダーの要求では以下のファイルが検索されます。With UseDefaultFiles, requests to a folder in wwwroot search for:

  • default.htmdefault.htm
  • default.htmldefault.html
  • index.htmindex.htm
  • index.htmlindex.html

一覧で見つかった最初のファイルは、要求で完全修飾 URI が使用されたかのように提供されます。The first file found from the list is served as though the request were the fully qualified URI. ブラウザー URL は、要求された URI を反映し続けます。The browser URL continues to reflect the URI requested.

次のコードによって、既定のファイル名が mydefault.html に変更されます。The following code changes the default file name to mydefault.html:

var options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("mydefault.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();

次のコードでは、上記のコードを含めた Startup.Configure を示します。The following code shows Startup.Configure with the preceding code:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    var options = new DefaultFilesOptions();
    options.DefaultFileNames.Clear();
    options.DefaultFileNames.Add("mydefault.html");
    app.UseDefaultFiles(options);
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

既定のドキュメントの UseFileServerUseFileServer for default documents

UseFileServer は、UseStaticFilesUseDefaultFiles、およびオプションとして UseDirectoryBrowser の機能を兼ね備えています。UseFileServer combines the functionality of UseStaticFiles, UseDefaultFiles, and optionally UseDirectoryBrowser.

app.UseFileServer を呼び出すと、静的ファイルと既定ファイルが提供できるようになります。Call app.UseFileServer to enable the serving of static files and the default file. ディレクトリ参照は有効にしません。Directory browsing isn't enabled. 次のコードでは、UseFileServer を含めた Startup.Configure を示します。The following code shows Startup.Configure with UseFileServer:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseFileServer();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

次のコードによって、静的ファイルの提供、既定ファイル、ディレクトリ参照が有効になります。The following code enables the serving of static files, the default file, and directory browsing:

app.UseFileServer(enableDirectoryBrowsing: true);

次のコードでは、上記のコードを含めた Startup.Configure を示します。The following code shows Startup.Configure with the preceding code:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseFileServer(enableDirectoryBrowsing: true);

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

次のディレクトリ階層があるとします。Consider the following directory hierarchy:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • MyImage.jpg
    • default.html

次のコードによって、MyStaticFiles の静的ファイルの提供、既定ファイル、ディレクトリ参照が有効になります。The following code enables the serving of static files, the default file, and directory browsing of MyStaticFiles:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddDirectoryBrowser();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles(); // For the wwwroot folder.

    // using Microsoft.Extensions.FileProviders;
    // using System.IO;
    app.UseFileServer(new FileServerOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "MyStaticFiles")),
        RequestPath = "/StaticFiles",
        EnableDirectoryBrowsing = true
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

EnableDirectoryBrowsing プロパティの値が true であるときは、AddDirectoryBrowser を呼び出す必要があります。AddDirectoryBrowser must be called when the EnableDirectoryBrowsing property value is true.

このファイル階層と前述のコードを使用すると、URL は次のように解決されます。Using the file hierarchy and preceding code, URLs resolve as follows:

URIURI 応答Response
https://<hostname>/StaticFiles/images/MyImage.jpg MyStaticFiles/images/MyImage.jpgMyStaticFiles/images/MyImage.jpg
https://<hostname>/StaticFiles MyStaticFiles/default.htmlMyStaticFiles/default.html

MyStaticFiles ディレクトリに既定の名前のファイルが存在しない場合、https://<hostname>/StaticFiles によってクリック可能なリンクを含むディレクトリの一覧が返されます。If no default-named file exists in the MyStaticFiles directory, https://<hostname>/StaticFiles returns the directory listing with clickable links:

静的ファイルの一覧

UseDefaultFiles および UseDirectoryBrowser では、末尾の / がないターゲット URI から末尾の / があるターゲット URI へのクライアント側リダイレクトが実行されます。UseDefaultFiles and UseDirectoryBrowser perform a client-side redirect from the target URI without a trailing / to the target URI with a trailing /. たとえば、https://<hostname>/StaticFileshttps://<hostname>/StaticFiles/ になります。For example, from https://<hostname>/StaticFiles to https://<hostname>/StaticFiles/. StaticFiles ディレクトリ内の相対 URL は、末尾のスラッシュ (/) がないと無効です。Relative URLs within the StaticFiles directory are invalid without a trailing slash (/).

FileExtensionContentTypeProviderFileExtensionContentTypeProvider

FileExtensionContentTypeProvider クラスには、MIME コンテンツ タイプへのファイル拡張子のマッピングを行う Mappings プロパティが含まれます。The FileExtensionContentTypeProvider class contains a Mappings property that serves as a mapping of file extensions to MIME content types. 次の例では、いくつかのファイル拡張子が、既知の MIME タイプにマッピングされています。In the following sample, several file extensions are mapped to known MIME types. .rtf 拡張子は置換され、 .mp4 は削除されています。The .rtf extension is replaced, and .mp4 is removed:

// using Microsoft.AspNetCore.StaticFiles;
// using Microsoft.Extensions.FileProviders;
// using System.IO;

// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(env.WebRootPath, "images")),
    RequestPath = "/MyImages",
    ContentTypeProvider = provider
});

app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(env.WebRootPath, "images")),
    RequestPath = "/MyImages"
});

次のコードでは、上記のコードを含めた Startup.Configure を示します。The following code shows Startup.Configure with the preceding code:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    // using Microsoft.AspNetCore.StaticFiles;
    // using Microsoft.Extensions.FileProviders;
    // using System.IO;

    // Set up custom content types - associating file extension to MIME type
    var provider = new FileExtensionContentTypeProvider();
    // Add new mappings
    provider.Mappings[".myapp"] = "application/x-msdownload";
    provider.Mappings[".htm3"] = "text/html";
    provider.Mappings[".image"] = "image/png";
    // Replace an existing mapping
    provider.Mappings[".rtf"] = "application/x-msdownload";
    // Remove MP4 videos.
    provider.Mappings.Remove(".mp4");

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages",
        ContentTypeProvider = provider
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.WebRootPath, "images")),
        RequestPath = "/MyImages"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

MIME content types」 (MIME コンテンツ タイプ) を参照してください。See MIME content types.

非標準のコンテンツ タイプNon-standard content types

静的ファイル ミドルウェアでは、約 400 の既知のファイル コンテンツ タイプが認識されています。The Static File Middleware understands almost 400 known file content types. ユーザーがファイルの種類が不明なファイルを要求した場合、静的ファイル ミドルウェアでその要求がパイプラインの次のミドルウェアに渡されます。If the user requests a file with an unknown file type, the Static File Middleware passes the request to the next middleware in the pipeline. ミドルウェアで要求が処理されない場合、404 見つかりません という応答が返されます。If no middleware handles the request, a 404 Not Found response is returned. ディレクトリ参照が有効になっている場合、ディレクトリ一覧にファイルへのリンクが表示されます。If directory browsing is enabled, a link to the file is displayed in a directory listing.

次のコードによって、不明なタイプを提供できるようにし、不明なファイルをイメージとしてレンダリングします。The following code enables serving unknown types and renders the unknown file as an image:

app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true,
    DefaultContentType = "image/png"
});

次のコードでは、上記のコードを含めた Startup.Configure を示します。The following code shows Startup.Configure with the preceding code:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();

    app.UseStaticFiles(new StaticFileOptions
    {
        ServeUnknownFileTypes = true,
        DefaultContentType = "image/png"
    });

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapDefaultControllerRoute();
    });
}

上記のコードでは、不明なコンテンツ タイプ ファイルに対する要求は、イメージとして返されます。With the preceding code, a request for a file with an unknown content type is returned as an image.

警告

ServeUnknownFileTypes を有効にすると、セキュリティ上リスクとなります。Enabling ServeUnknownFileTypes is a security risk. これは既定では無効で、使用は推奨されていません。It's disabled by default, and its use is discouraged. 非標準の拡張子のファイルを提供する場合、より安全な代替となるのは、FileExtensionContentTypeProvider です。FileExtensionContentTypeProvider provides a safer alternative to serving files with non-standard extensions.

複数の場所からファイルを提供するServe files from multiple locations

UseStaticFilesUseFileServer の既定では、wwwroot をポイントするファイル プロバイダーが作成されます。UseStaticFiles and UseFileServer default to the file provider pointing at wwwroot. UseStaticFiles および UseFileServer の追加インスタンスを作成して他のファイル プロバイダーを使用すると、他の場所からファイルを提供することができます。Additional instances of UseStaticFiles and UseFileServer can be provided with other file providers to serve files from other locations. 詳細については、次を参照してください。この GitHub の問題します。For more information, see this GitHub issue.

静的ファイルのセキュリティに関する注意点Security considerations for static files

警告

UseDirectoryBrowserUseStaticFiles では、機密データが漏洩することがあります。UseDirectoryBrowser and UseStaticFiles can leak secrets. 本番では、ディレクトリ参照を無効にすることが、強く推奨されます。Disabling directory browsing in production is highly recommended. UseStaticFilesUseDirectoryBrowser でどのディレクトリが有効になっているか、慎重にご確認ください。Carefully review which directories are enabled via UseStaticFiles or UseDirectoryBrowser. ディレクトリ全体とそのサブディレクトリが、パブリックにアクセス可能になります。The entire directory and its sub-directories become publicly accessible. ファイルは、パブリックに提供するのに適した、<content_root>/wwwroot などの専用ディレクトリに格納します。Store files suitable for serving to the public in a dedicated directory, such as <content_root>/wwwroot. これらのファイルは、MVC ビュー、Razor Pages、構成ファイルなどとは別にします。Separate these files from MVC views, Razor Pages, configuration files, etc.

  • UseDirectoryBrowserUseStaticFiles で公開されるコンテンツの URL では、大文字と小文字が区別され、基になるファイル システムの文字制限の影響を受けます。The URLs for content exposed with UseDirectoryBrowser and UseStaticFiles are subject to the case sensitivity and character restrictions of the underlying file system. たとえば、Windows では大文字と小文字が区別されませんが、macOS と Linux では区別されます。For example, Windows is case insensitive, but macOS and Linux aren't.

  • IIS でホストされている ASP.NET Core アプリは、ASP.NET Core モジュールを使用して、静的ファイルの要求を含む、すべての要求をアプリに転送します。ASP.NET Core apps hosted in IIS use the ASP.NET Core Module to forward all requests to the app, including static file requests. IIS の静的ファイル ハンドラーは使用されず、要求を処理することはできません。The IIS static file handler isn't used and has no chance to handle requests.

  • IIS マネージャーで次の手順を実行し、サーバーまたは Web サイト レベルで IIS の静的ファイル ハンドラーを削除します。Complete the following steps in IIS Manager to remove the IIS static file handler at the server or website level:

    1. [モジュール] 機能に移動します。Navigate to the Modules feature.
    2. 一覧の [StaticFileModule] を選択します。Select StaticFileModule in the list.
    3. [アクション] サイドバーで、 [削除] をクリックします。Click Remove in the Actions sidebar.

警告

IIS の静的ファイル ハンドラーが有効になっており、かつ、ASP.NET Core モジュールが正しく構成されていない場合、静的ファイルにサービスが提供されます。If the IIS static file handler is enabled and the ASP.NET Core Module is configured incorrectly, static files are served. これは、たとえば、web.config ファイルが配置されていない場合などで発生します。This happens, for example, if the web.config file isn't deployed.

  • アプリ プロジェクトの Web ルートの外に、コード ファイル ( .cs.cshtml を含む) を配置します。Place code files, including .cs and .cshtml, outside of the app project's web root. これにより、アプリのクライアント側コンテンツとサーバー ベースのコードの間で、論理的な分離が作成されます。A logical separation is therefore created between the app's client-side content and server-based code. これによって、サーバー側のコードが漏洩するのを防ぎます。This prevents server-side code from being leaked.

その他の技術情報Additional resources

作成者: Rick AndersonScott AddieBy Rick Anderson and Scott Addie

HTML、CSS、画像、JavaScript などの静的ファイルは、ASP.NET Core アプリにより直接クライアントに提供される資産です。Static files, such as HTML, CSS, images, and JavaScript, are assets an ASP.NET Core app serves directly to clients. これらのファイルを提供するには、いくつかの構成が必要です。Some configuration is required to enable serving of these files.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

静的ファイルの提供Serve static files

静的ファイルは、プロジェクトの Web ルート ディレクトリ内に格納されています。Static files are stored within the project's web root directory. 既定のディレクトリは {content root}/wwwroot ですが、UseWebRoot メソッドを使用して変更できます。The default directory is {content root}/wwwroot, but it can be changed via the UseWebRoot method. 詳細については、「コンテンツ ルート」および「Web ルート」を参照してください。See Content root and Web root for more information.

アプリの Web ホストでは、コンテンツのルート ディレクトリが把握されている必要があります。The app's web host must be made aware of the content root directory.

WebHost.CreateDefaultBuilder メソッドでは、コンテンツのルートが現在のディレクトリに設定されます。The WebHost.CreateDefaultBuilder method sets the content root to the current directory:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

静的ファイルには、Web ルートに対する相対パスを使用してアクセスできます。Static files are accessible via a path relative to the web root. たとえば、Web アプリケーション プロジェクト テンプレートでは、wwwroot フォルダー内に次のいくつかのフォルダーが含まれています。For example, the Web Application project template contains several folders within the wwwroot folder:

  • wwwroot
    • css
    • images
    • js

images サブフォルダーのファイルにアクセスするための URI は、http://<server_address>/images/<image_file_name> です。The URI format to access a file in the images subfolder is http://<server_address>/images/<image_file_name>. たとえば、 http://localhost:9189/images/banner3.svg です。For example, http://localhost:9189/images/banner3.svg.

.NET Framework を対象としている場合、プロジェクトに Microsoft.AspNetCore.StaticFiles パッケージを追加します。If targeting .NET Framework, add the Microsoft.AspNetCore.StaticFiles package to the project. .NET Core をターゲットとする場合、Microsoft.AspNetCore.App メタパッケージにこのパッケージが含まれます。If targeting .NET Core, the Microsoft.AspNetCore.App metapackage includes this package.

静的ファイル サービスの提供を可能にする、ミドルウェアを構成します。Configure the middleware, which enables the serving of static files.

Web ルート内のファイルの提供Serve files inside of web root

Startup.Configure 内で UseStaticFiles メソッドを呼び出します。Invoke the UseStaticFiles method within Startup.Configure:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();
}

UseStaticFiles メソッドのパラメーターなしのオーバーロードによって、Web ルート内のファイルが提供可能とマークされます。The parameterless UseStaticFiles method overload marks the files in web root as servable. 次のマークアップは、wwwroot/images/banner1.svg を参照します。The following markup references wwwroot/images/banner1.svg:

<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />

上記のコードでは、チルダ文字 ~/Web ルートを指します。In the preceding code, the tilde character ~/ points to the web root.

Web ルート外のファイルの提供Serve files outside of web root

提供する静的ファイルが Web ルートの外にあるディレクトリ階層について考えます。Consider a directory hierarchy in which the static files to be served reside outside of the web root:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • banner1.svg

静的ファイル ミドルウェアを次のように構成すると、要求で banner1.svg ファイルにアクセスできます。A request can access the banner1.svg file by configuring the Static File Middleware as follows:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });
}

前述のコードでは、MyStaticFiles ディレクトリ階層は、StaticFiles URI セグメントでパブリックに公開されています。In the preceding code, the MyStaticFiles directory hierarchy is exposed publicly via the StaticFiles URI segment. http://<server_address>/StaticFiles/images/banner1.svg に対する要求によって、banner1.svg ファイルが提供されます。A request to http://<server_address>/StaticFiles/images/banner1.svg serves the banner1.svg file.

次のマークアップは、MyStaticFiles/images/banner1.svg を参照します。The following markup references MyStaticFiles/images/banner1.svg:

<img src="~/StaticFiles/images/banner1.svg" alt="ASP.NET" class="img-responsive" />

HTTP 応答ヘッダーの設定Set HTTP response headers

StaticFileOptions オブジェクトを使用すると、HTTP 応答ヘッダーを設定できます。A StaticFileOptions object can be used to set HTTP response headers. Web ルートから提供される静的ファイルの構成に加えて、次のコードで Cache-Control ヘッダーを設定します。In addition to configuring static file serving from the web root, the following code sets the Cache-Control header:

public void Configure(IApplicationBuilder app)
{
    var cachePeriod =  "604800";
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            // Requires the following import:
            // using Microsoft.AspNetCore.Http;
            ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
        }
    });
}

コードのコメントを英語以外の言語に翻訳し表示したい場合、こちらの GitHub ディスカッション イシューにてお知らせください。If you would like to see code comments translated to languages other than English, let us know in this GitHub discussion issue.

HeaderDictionaryExtensions.Append メソッドは、Microsoft.AspNetCore.Http パッケージにあります。The HeaderDictionaryExtensions.Append method exists in the Microsoft.AspNetCore.Http package.

これらのファイルは、開発環境で 10 分間 (600 秒) パブリックにキャッシュ可能でした。The files have been made publicly cacheable for 10 minutes (600 seconds) in the Development environment:

Cache-Control ヘッダーが追加された応答ヘッダー

静的ファイルの承認Static file authorization

静的ファイル ミドルウェアでは、承認の確認は行いません。The Static File Middleware doesn't provide authorization checks. wwwroot の下にあるものも含め、このミドルウェアによって提供されるすべてのファイルは、一般に公開されます。Any files served by it, including those under wwwroot, are publicly accessible. 承認に基づいてファイルを提供するには:To serve files based on authorization:

  • wwwroot や静的ファイル ミドルウェアがアクセスできる任意のディレクトリの外にファイルを配置します。Store them outside of wwwroot and any directory accessible to the Static File Middleware.

  • 承認が適用されるアクション メソッドを使用して提供するようにします。Serve them via an action method to which authorization is applied. FileResult オブジェクトを返します。Return a FileResult object:

    [Authorize]
    public IActionResult BannerImage()
    {
        var file = Path.Combine(Directory.GetCurrentDirectory(), 
                                "MyStaticFiles", "images", "banner1.svg");
    
        return PhysicalFile(file, "image/svg+xml");
    }
    

ディレクトリ参照の有効化Enable directory browsing

ディレクトリ参照では、Web アプリのユーザーが、ディレクトリ一覧および、指定したディレクトリ内のファイルを参照できるようになります。Directory browsing allows users of your web app to see a directory listing and files within a specified directory. ディレクトリ参照は、セキュリティ上の理由から既定で無効になっています (「注意点」を参照)。Directory browsing is disabled by default for security reasons (see Considerations). Startup.ConfigureUseDirectoryBrowser メソッドを呼び出すことで、ディレクトリの参照を有効にします。Enable directory browsing by invoking the UseDirectoryBrowser method in Startup.Configure:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });
}

Startup.ConfigureServices から AddDirectoryBrowser メソッドを呼び出すと、必要なサービスを追加することができます。Add required services by invoking the AddDirectoryBrowser method from Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDirectoryBrowser();
}

上記のコードでは、URL http://<server_address>/MyImages が使用され、各ファイルおよびフォルダーへのリンクを含む wwwroot/images フォルダーのディレクトリが参照できるようになります。The preceding code allows directory browsing of the wwwroot/images folder using the URL http://<server_address>/MyImages, with links to each file and folder:

ディレクトリ参照

参照を有効にした場合のセキュリティ上のリスクについては、「注意点」を参照してください。See Considerations on the security risks when enabling browsing.

次の例の 2 つの UseStaticFiles 呼び出しを確認してください。Note the two UseStaticFiles calls in the following example. 最初の呼び出しにより、wwwroot フォルダー内の静的ファイルが提供されます。The first call enables the serving of static files in the wwwroot folder. 2 番目の呼び出しにより、URL http://<server_address>/MyImages が使用され、wwwroot/images フォルダーのディレクトリ参照が有効になります。The second call enables directory browsing of the wwwroot/images folder using the URL http://<server_address>/MyImages:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });
}

既定のドキュメントの提供Serve a default document

設定された既定のホーム ページは、サイトを訪問するユーザーの論理的な開始点となります。Setting a default home page provides visitors a logical starting point when visiting your site. ユーザーが URI を完全修飾しない場合に既定のページを提供するには、Startup.Configure から UseDefaultFiles メソッドを呼び出します。To serve a default page without the user fully qualifying the URI, call the UseDefaultFiles method from Startup.Configure:

public void Configure(IApplicationBuilder app)
{
    app.UseDefaultFiles();
    app.UseStaticFiles();
}

重要

既定のファイルを提供するには、UseStaticFiles の前に UseDefaultFiles が呼び出される必要があります。UseDefaultFiles must be called before UseStaticFiles to serve the default file. UseDefaultFiles は、ファイルを実際には提供しない URL リライターです。UseDefaultFiles is a URL rewriter that doesn't actually serve the file. ファイルを提供するには、UseStaticFiles を使用して静的ファイル ミドルウェアを有効にします。Enable Static File Middleware via UseStaticFiles to serve the file.

UseDefaultFiles を使用し、以下のフォルダーを検索します。With UseDefaultFiles, requests to a folder search for:

  • default.htmdefault.htm
  • default.htmldefault.html
  • index.htmindex.htm
  • index.htmlindex.html

一覧で見つかった最初のファイルは、要求で完全修飾 URI が使用されたかのように提供されます。The first file found from the list is served as though the request were the fully qualified URI. ブラウザー URL は、要求された URI を反映し続けます。The browser URL continues to reflect the URI requested.

次のコードによって、既定のファイル名が mydefault.html に変更されます。The following code changes the default file name to mydefault.html:

public void Configure(IApplicationBuilder app)
{
    // Serve my app-specific default file, if present.
    DefaultFilesOptions options = new DefaultFilesOptions();
    options.DefaultFileNames.Clear();
    options.DefaultFileNames.Add("mydefault.html");
    app.UseDefaultFiles(options);
    app.UseStaticFiles();
}

UseFileServerUseFileServer

UseFileServer は、UseStaticFilesUseDefaultFiles、およびオプションとして UseDirectoryBrowser の機能を兼ね備えています。UseFileServer combines the functionality of UseStaticFiles, UseDefaultFiles, and optionally UseDirectoryBrowser.

次のコードによって、静的ファイルと既定ファイルが提供できるようになります。The following code enables the serving of static files and the default file. ディレクトリ参照は有効にしません。Directory browsing isn't enabled.

app.UseFileServer();

次のコードは、ディレクトリ参照が有効になった、パラメーターなしのオーバーロード時に構築されます。The following code builds upon the parameterless overload by enabling directory browsing:

app.UseFileServer(enableDirectoryBrowsing: true);

次のディレクトリ階層があるとします。Consider the following directory hierarchy:

  • wwwrootwwwroot
    • csscss
    • imagesimages
    • jsjs
  • MyStaticFilesMyStaticFiles
    • imagesimages
      • banner1.svgbanner1.svg
    • default.htmldefault.html

次のコードにより、MyStaticFiles への静的ファイル、既定ファイル、ディレクトリ参照が有効になります。The following code enables static files, default files, and directory browsing of MyStaticFiles:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseFileServer(new FileServerOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
        RequestPath = "/StaticFiles",
        EnableDirectoryBrowsing = true
    });
}

EnableDirectoryBrowsing プロパティの値が true であるとき、AddDirectoryBrowser を呼び出す必要があります。AddDirectoryBrowser must be called when the EnableDirectoryBrowsing property value is true:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDirectoryBrowser();
}

このファイル階層と前述のコードを使用すると、URL は次のように解決されます。Using the file hierarchy and preceding code, URLs resolve as follows:

URIURI 応答Response
http://<server_address>/StaticFiles/images/banner1.svghttp://<server_address>/StaticFiles/images/banner1.svg MyStaticFiles/images/banner1.svgMyStaticFiles/images/banner1.svg
http://<server_address>/StaticFileshttp://<server_address>/StaticFiles MyStaticFiles/default.htmlMyStaticFiles/default.html

MyStaticFiles ディレクトリに既定の名前のファイルが存在しない場合、http://<server_address>/StaticFiles によってクリック可能なリンクを含むディレクトリの一覧が返されます。If no default-named file exists in the MyStaticFiles directory, http://<server_address>/StaticFiles returns the directory listing with clickable links:

静的ファイルの一覧

注意

UseDefaultFiles および UseDirectoryBrowser では、http://{SERVER ADDRESS}/StaticFiles (末尾のスラッシュなし) から http://{SERVER ADDRESS}/StaticFiles/ (末尾のスラッシュあり) へのクライアント側リダイレクトが実行されます。UseDefaultFiles and UseDirectoryBrowser perform a client-side redirect from http://{SERVER ADDRESS}/StaticFiles (without a trailing slash) to http://{SERVER ADDRESS}/StaticFiles/ (with a trailing slash). StaticFiles ディレクトリ内の相対 URL は、末尾のスラッシュがないと無効です。Relative URLs within the StaticFiles directory are invalid without a trailing slash.

FileExtensionContentTypeProviderFileExtensionContentTypeProvider

FileExtensionContentTypeProvider クラスには、MIME コンテンツ タイプへのファイル拡張子のマッピングを行う Mappings プロパティが含まれます。The FileExtensionContentTypeProvider class contains a Mappings property serving as a mapping of file extensions to MIME content types. 次の例では、いくつかのファイル拡張子は、既知の MIME タイプに登録されています。In the following sample, several file extensions are registered to known MIME types. .rtf 拡張子は置換され、 .mp4 は削除されています。The .rtf extension is replaced, and .mp4 is removed.

public void Configure(IApplicationBuilder app)
{
    // Set up custom content types - associating file extension to MIME type
    var provider = new FileExtensionContentTypeProvider();
    // Add new mappings
    provider.Mappings[".myapp"] = "application/x-msdownload";
    provider.Mappings[".htm3"] = "text/html";
    provider.Mappings[".image"] = "image/png";
    // Replace an existing mapping
    provider.Mappings[".rtf"] = "application/x-msdownload";
    // Remove MP4 videos.
    provider.Mappings.Remove(".mp4");

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages",
        ContentTypeProvider = provider
    });

    app.UseDirectoryBrowser(new DirectoryBrowserOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
        RequestPath = "/MyImages"
    });
}

MIME content types」 (MIME コンテンツ タイプ) を参照してください。See MIME content types.

カスタム FileExtensionContentTypeProvider を使用する方法、または Blazor サーバー アプリで他の StaticFileOptions を構成する方法については、ASP.NET Core Blazor ホスティング モデルの構成 を参照してください。For information on using a custom FileExtensionContentTypeProvider or to configure other StaticFileOptions in Blazor Server apps, see ASP.NET Core Blazor ホスティング モデルの構成.

非標準のコンテンツ タイプNon-standard content types

静的ファイル ミドルウェアでは、約 400 個の既知のファイル コンテンツ タイプが認識されます。Static File Middleware understands almost 400 known file content types. ユーザーがファイルの種類が不明なファイルを要求した場合、静的ファイル ミドルウェアでその要求がパイプラインの次のミドルウェアに渡されます。If the user requests a file with an unknown file type, Static File Middleware passes the request to the next middleware in the pipeline. ミドルウェアで要求が処理されない場合、404 見つかりません という応答が返されます。If no middleware handles the request, a 404 Not Found response is returned. ディレクトリ参照が有効になっている場合、ディレクトリ一覧にファイルへのリンクが表示されます。If directory browsing is enabled, a link to the file is displayed in a directory listing.

次のコードによって、不明なタイプを提供できるようにし、不明なファイルをイメージとしてレンダリングします。The following code enables serving unknown types and renders the unknown file as an image:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(new StaticFileOptions
    {
        ServeUnknownFileTypes = true,
        DefaultContentType = "image/png"
    });
}

上記のコードでは、不明なコンテンツ タイプ ファイルに対する要求は、イメージとして返されます。With the preceding code, a request for a file with an unknown content type is returned as an image.

警告

ServeUnknownFileTypes を有効にすると、セキュリティ上リスクとなります。Enabling ServeUnknownFileTypes is a security risk. これは既定では無効で、使用は推奨されていません。It's disabled by default, and its use is discouraged. 非標準の拡張子のファイルを提供する場合、より安全な代替となるのは、FileExtensionContentTypeProvider です。FileExtensionContentTypeProvider provides a safer alternative to serving files with non-standard extensions.

複数の場所からファイルを提供するServe files from multiple locations

UseStaticFilesUseFileServer の既定では、wwwroot をポイントするファイル プロバイダーが作成されます。UseStaticFiles and UseFileServer defaults to the file provider pointing at wwwroot. 他のファイル プロバイダーを使用する UseStaticFiles および UseFileServer の追加インスタンスを作成して、他の場所からファイルを提供することができます。You can provide additional instances of UseStaticFiles and UseFileServer with other file providers to serve files from other locations. 詳細については、次を参照してください。この GitHub の問題します。For more information, see this GitHub issue.

注意事項Considerations

警告

UseDirectoryBrowserUseStaticFiles では、機密データが漏洩することがあります。UseDirectoryBrowser and UseStaticFiles can leak secrets. 本番では、ディレクトリ参照を無効にすることが、強く推奨されます。Disabling directory browsing in production is highly recommended. UseStaticFilesUseDirectoryBrowser でどのディレクトリが有効になっているか、慎重にご確認ください。Carefully review which directories are enabled via UseStaticFiles or UseDirectoryBrowser. ディレクトリ全体とそのサブディレクトリが、パブリックにアクセス可能になります。The entire directory and its sub-directories become publicly accessible. ファイルは、パブリックに提供するのに適した、 <content_root>/wwwroot などの専用ディレクトリに格納します。Store files suitable for serving to the public in a dedicated directory, such as <content_root>/wwwroot. これらのファイルは、MVC ビュー、Razor Pages (2.x のみ)、構成ファイルなどとは別にします。Separate these files from MVC views, Razor Pages (2.x only), configuration files, etc.

  • UseDirectoryBrowserUseStaticFiles で公開されるコンテンツの URL では、大文字と小文字が区別され、基になるファイル システムの文字制限の影響を受けます。The URLs for content exposed with UseDirectoryBrowser and UseStaticFiles are subject to the case sensitivity and character restrictions of the underlying file system. たとえば、Windows では大文字小文字は区別されますが、macOS と Linux ではされません。For example, Windows is case insensitive—macOS and Linux aren't.

  • IIS でホストされている ASP.NET Core アプリは、ASP.NET Core モジュールを使用して、静的ファイルの要求を含む、すべての要求をアプリに転送します。ASP.NET Core apps hosted in IIS use the ASP.NET Core Module to forward all requests to the app, including static file requests. IIS 静的ファイル ハンドラーは使用されません。The IIS static file handler isn't used. モジュールによって処理される前に、これで要求が処理されることはありません。It has no chance to handle requests before they're handled by the module.

  • IIS マネージャーで次の手順を実行し、サーバーまたは Web サイト レベルで IIS の静的ファイル ハンドラーを削除します。Complete the following steps in IIS Manager to remove the IIS static file handler at the server or website level:

    1. [モジュール] 機能に移動します。Navigate to the Modules feature.
    2. 一覧の [StaticFileModule] を選択します。Select StaticFileModule in the list.
    3. [アクション] サイドバーで、 [削除] をクリックします。Click Remove in the Actions sidebar.

警告

IIS の静的ファイル ハンドラーが有効になっており、かつ、ASP.NET Core モジュールが正しく構成されていない場合、静的ファイルにサービスが提供されます。If the IIS static file handler is enabled and the ASP.NET Core Module is configured incorrectly, static files are served. これは、たとえば、web.config ファイルが配置されていない場合などで発生します。This happens, for example, if the web.config file isn't deployed.

  • アプリ プロジェクトの Web ルートの外に、コード ファイル ( .cs.cshtml を含む) を配置します。Place code files (including .cs and .cshtml) outside of the app project's web root. これにより、アプリのクライアント側コンテンツとサーバー ベースのコードの間で、論理的な分離が作成されます。A logical separation is therefore created between the app's client-side content and server-based code. これによって、サーバー側のコードが漏洩するのを防ぎます。This prevents server-side code from being leaked.

その他の技術情報Additional resources