diff --git a/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs b/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs
new file mode 100644
index 000000000..b904b0e9a
--- /dev/null
+++ b/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs
@@ -0,0 +1,30 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using Microsoft.AspNetCore.Http;
+
+namespace Squidex.Areas.Frontend.Middlewares
+{
+ public static class IndexExtensions
+ {
+ public static bool IsIndexHtml(this HttpContext context)
+ {
+ return context.IsIndex() && context.IsHtml();
+ }
+
+ public static bool IsIndex(this HttpContext context)
+ {
+ return context.Request.Path.Value.EndsWith("/index.html", StringComparison.OrdinalIgnoreCase);
+ }
+
+ public static bool IsHtml(this HttpContext context)
+ {
+ return context.Response.ContentType?.ToLower().Contains("text/html") == true;
+ }
+ }
+}
diff --git a/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs b/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs
new file mode 100644
index 000000000..65dea1c28
--- /dev/null
+++ b/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs
@@ -0,0 +1,66 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschränkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Http;
+
+namespace Squidex.Areas.Frontend.Middlewares
+{
+ public sealed class IndexMiddleware
+ {
+ private readonly RequestDelegate next;
+
+ public IndexMiddleware(RequestDelegate next)
+ {
+ this.next = next;
+ }
+
+ public async Task Invoke(HttpContext context)
+ {
+ var basePath = context.Request.PathBase;
+
+ if (context.IsIndex() && basePath.HasValue)
+ {
+ var responseBuffer = new MemoryStream();
+ var responseBody = context.Response.Body;
+
+ context.Response.Body = responseBuffer;
+
+ await next(context);
+
+ context.Response.Body = responseBody;
+
+ if (context.Response.StatusCode == 200 && context.IsIndexHtml())
+ {
+ var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
+
+ response = AdjustBase(response, basePath);
+
+ context.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
+ context.Response.Body = responseBody;
+
+ await context.Response.WriteAsync(response);
+ }
+ else if (context.Response.StatusCode != 304)
+ {
+ await responseBuffer.CopyToAsync(responseBody);
+ }
+ }
+ else
+ {
+ await next(context);
+ }
+ }
+
+ private static string AdjustBase(string response, string baseUrl)
+ {
+ return response.Replace("", $"");
+ }
+ }
+}
diff --git a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
index 4e4944200..e02d78ae9 100644
--- a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
+++ b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
@@ -10,7 +10,6 @@ using System.IO;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
-using Microsoft.Net.Http.Headers;
namespace Squidex.Areas.Frontend.Middlewares
{
@@ -29,46 +28,38 @@ namespace Squidex.Areas.Frontend.Middlewares
public async Task Invoke(HttpContext context)
{
- var responseBuffer = new MemoryStream();
- var responseBody = context.Response.Body;
+ if (context.IsIndex())
+ {
+ var responseBuffer = new MemoryStream();
+ var responseBody = context.Response.Body;
- context.Response.Body = responseBuffer;
+ context.Response.Body = responseBuffer;
- await next(context);
+ await next(context);
- responseBuffer.Seek(0, SeekOrigin.Begin);
+ context.Response.Body = responseBody;
- if (context.Response.StatusCode == 200 && IsIndex(context) && IsHtml(context))
- {
- using (var reader = new StreamReader(responseBuffer))
+ if (context.Response.StatusCode == 200 && context.IsIndexHtml())
{
- var response = await reader.ReadToEndAsync();
+ var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
response = InjectStyles(response);
response = InjectScripts(response);
- using (var memoryStream = new MemoryStream())
- {
- using (var writer = new StreamWriter(memoryStream))
- {
- writer.Write(response);
- writer.Flush();
-
- memoryStream.Seek(0, SeekOrigin.Begin);
-
- context.Response.Headers[HeaderNames.ContentLength] = memoryStream.Length.ToString();
+ context.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
+ context.Response.Body = responseBody;
- await memoryStream.CopyToAsync(responseBody);
- }
- }
+ await context.Response.WriteAsync(response);
+ }
+ else if (context.Response.StatusCode != 304)
+ {
+ await responseBuffer.CopyToAsync(responseBody);
}
}
- else if (context.Response.StatusCode != 304)
+ else
{
- await responseBuffer.CopyToAsync(responseBody);
+ await next(context);
}
-
- context.Response.Body = responseBody;
}
private static string InjectStyles(string response)
@@ -108,15 +99,5 @@ namespace Squidex.Areas.Frontend.Middlewares
return response;
}
-
- private static bool IsIndex(HttpContext context)
- {
- return context.Request.Path.Value.Equals("/index.html", StringComparison.OrdinalIgnoreCase);
- }
-
- private static bool IsHtml(HttpContext context)
- {
- return context.Response.ContentType?.ToLower().Contains("text/html") == true;
- }
}
}
diff --git a/src/Squidex/Areas/Frontend/Startup.cs b/src/Squidex/Areas/Frontend/Startup.cs
index dcd10c2b1..875945463 100644
--- a/src/Squidex/Areas/Frontend/Startup.cs
+++ b/src/Squidex/Areas/Frontend/Startup.cs
@@ -23,10 +23,7 @@ namespace Squidex.Areas.Frontend
{
var environment = app.ApplicationServices.GetRequiredService();
- if (environment.IsDevelopment())
- {
- app.UseMiddleware();
- }
+ app.UseMiddleware();
app.Use((context, next) =>
{
@@ -53,7 +50,14 @@ namespace Squidex.Areas.Frontend
return next();
});
- app.UseMiddleware();
+ if (environment.IsDevelopment())
+ {
+ app.UseMiddleware();
+ }
+ else
+ {
+ app.UseMiddleware();
+ }
app.UseStaticFiles(new StaticFileOptions
{
diff --git a/src/Squidex/app-config/webpack.config.js b/src/Squidex/app-config/webpack.config.js
index 6b7981e5b..3af7f467c 100644
--- a/src/Squidex/app-config/webpack.config.js
+++ b/src/Squidex/app-config/webpack.config.js
@@ -83,7 +83,11 @@ module.exports = {
}, {
test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/,
use: [{
- loader: 'file-loader?name=assets/[name].[hash].[ext]'
+ loader: 'file-loader?name=assets/[name].[hash].[ext]',
+ options: {
+ publicPath: 'assets/',
+ outputPath: 'assets'
+ }
}]
}, {
test: /\.(png|jpe?g|gif|svg|ico)(\?.*$|$)/,
diff --git a/src/Squidex/app-config/webpack.run.prod.js b/src/Squidex/app-config/webpack.run.prod.js
index 9ded6e3c5..07fbca634 100644
--- a/src/Squidex/app-config/webpack.run.prod.js
+++ b/src/Squidex/app-config/webpack.run.prod.js
@@ -30,7 +30,7 @@ module.exports = webpackMerge(runConfig, {
*/
path: helpers.root('wwwroot/build/'),
- publicPath: '/build/',
+ publicPath: './build/',
/**
* Specifies the name of each output file on disk.
diff --git a/src/Squidex/wwwroot/index.html b/src/Squidex/wwwroot/index.html
index 8387227e9..54a134c2f 100644
--- a/src/Squidex/wwwroot/index.html
+++ b/src/Squidex/wwwroot/index.html
@@ -41,7 +41,7 @@
-

+
Loading Squidex