diff --git a/Jellyfin.Server/Middleware/BaseUrlRedirectionMiddleware.cs b/Jellyfin.Server/Middleware/BaseUrlRedirectionMiddleware.cs
index 9316737bdf..ae3a3a1c54 100644
--- a/Jellyfin.Server/Middleware/BaseUrlRedirectionMiddleware.cs
+++ b/Jellyfin.Server/Middleware/BaseUrlRedirectionMiddleware.cs
@@ -44,11 +44,7 @@ namespace Jellyfin.Server.Middleware
var localPath = httpContext.Request.Path.ToString();
var baseUrlPrefix = serverConfigurationManager.Configuration.BaseUrl;
- if (string.Equals(localPath, baseUrlPrefix + "/", StringComparison.OrdinalIgnoreCase)
- || string.Equals(localPath, baseUrlPrefix, StringComparison.OrdinalIgnoreCase)
- || string.Equals(localPath, "/", StringComparison.OrdinalIgnoreCase)
- || string.IsNullOrEmpty(localPath)
- || !localPath.StartsWith(baseUrlPrefix, StringComparison.OrdinalIgnoreCase))
+ if (!localPath.StartsWith(baseUrlPrefix, StringComparison.OrdinalIgnoreCase))
{
// Always redirect back to the default path if the base prefix is invalid or missing
_logger.LogDebug("Normalizing an URL at {LocalPath}", localPath);
diff --git a/Jellyfin.Server/Startup.cs b/Jellyfin.Server/Startup.cs
index b222c622c4..ee84e8201e 100644
--- a/Jellyfin.Server/Startup.cs
+++ b/Jellyfin.Server/Startup.cs
@@ -88,71 +88,78 @@ namespace Jellyfin.Server
///
/// The application builder.
/// The webhost environment.
- /// The server application host.
/// The application config.
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
- IServerApplicationHost serverApplicationHost,
IConfiguration appConfig)
{
- if (env.IsDevelopment())
+ // Only add base url redirection if a base url is set.
+ if (!string.IsNullOrEmpty(_serverConfigurationManager.Configuration.BaseUrl))
{
- app.UseDeveloperExceptionPage();
+ app.UseBaseUrlRedirection();
}
- app.UseMiddleware();
+ // Wrap rest of configuration so everything only listens on BaseUrl.
+ app.Map(_serverConfigurationManager.Configuration.BaseUrl, mainApp =>
+ {
+ if (env.IsDevelopment())
+ {
+ mainApp.UseDeveloperExceptionPage();
+ }
- app.UseMiddleware();
+ mainApp.UseMiddleware();
- app.UseWebSockets();
+ mainApp.UseMiddleware();
- app.UseResponseCompression();
+ mainApp.UseWebSockets();
- app.UseCors(ServerCorsPolicy.DefaultPolicyName);
+ mainApp.UseResponseCompression();
- if (_serverConfigurationManager.Configuration.RequireHttps
- && _serverApplicationHost.ListenWithHttps)
- {
- app.UseHttpsRedirection();
- }
+ mainApp.UseCors(ServerCorsPolicy.DefaultPolicyName);
- app.UseStaticFiles();
- app.UsePathBase(_serverConfigurationManager.Configuration.BaseUrl);
- if (appConfig.HostWebClient())
- {
- app.UseStaticFiles(new StaticFileOptions
+ if (_serverConfigurationManager.Configuration.RequireHttps
+ && _serverApplicationHost.ListenWithHttps)
{
- FileProvider = new PhysicalFileProvider(_serverConfigurationManager.ApplicationPaths.WebPath),
- RequestPath = "/web"
- });
- }
-
- app.UseAuthentication();
- app.UseJellyfinApiSwagger(_serverConfigurationManager);
- app.UseRouting();
- app.UseAuthorization();
- if (_serverConfigurationManager.Configuration.EnableMetrics)
- {
- // Must be registered after any middleware that could change HTTP response codes or the data will be bad
- app.UseHttpMetrics();
- }
+ mainApp.UseHttpsRedirection();
+ }
- app.UseLanFiltering();
- app.UseIpBasedAccessValidation();
- app.UseBaseUrlRedirection();
- app.UseWebSocketHandler();
- app.UseServerStartupMessage();
+ mainApp.UsePathBase(_serverConfigurationManager.Configuration.BaseUrl);
+ mainApp.UseStaticFiles();
+ if (appConfig.HostWebClient())
+ {
+ mainApp.UseStaticFiles(new StaticFileOptions
+ {
+ FileProvider = new PhysicalFileProvider(_serverConfigurationManager.ApplicationPaths.WebPath),
+ RequestPath = "/web"
+ });
+ }
- app.UseEndpoints(endpoints =>
- {
- endpoints.MapControllers();
+ mainApp.UseAuthentication();
+ mainApp.UseJellyfinApiSwagger(_serverConfigurationManager);
+ mainApp.UseRouting();
+ mainApp.UseAuthorization();
if (_serverConfigurationManager.Configuration.EnableMetrics)
{
- endpoints.MapMetrics(_serverConfigurationManager.Configuration.BaseUrl.TrimStart('/') + "/metrics");
+ // Must be registered after any middleware that could change HTTP response codes or the data will be bad
+ mainApp.UseHttpMetrics();
}
- endpoints.MapHealthChecks(_serverConfigurationManager.Configuration.BaseUrl.TrimStart('/') + "/health");
+ mainApp.UseLanFiltering();
+ mainApp.UseIpBasedAccessValidation();
+ mainApp.UseWebSocketHandler();
+ mainApp.UseServerStartupMessage();
+
+ mainApp.UseEndpoints(endpoints =>
+ {
+ endpoints.MapControllers();
+ if (_serverConfigurationManager.Configuration.EnableMetrics)
+ {
+ endpoints.MapMetrics("/metrics");
+ }
+
+ endpoints.MapHealthChecks("/health");
+ });
});
// Add type descriptor for legacy datetime parsing.