我试图将自定义中间件注入OWIN管道,该中间件包装StaticFileMiddleware
来自MS 的可用中间件,以便在AngularJS中支持HTML
5模式。我一直在遵循此指南:http :
//geekswithblogs.net/shaunxu/archive/2014/06/10/host-angularjs-html5mode-in-
asp.net-vnext.aspx
从我可以收集到的信息来看,中间件将请求传递给静态文件中间件,然后,如果中间件不能解决这些请求(即,对HTML 5角路径的请求,“ / whatever
”),而是返回基本的角度页面,以便对HTML 5路径进行硬性请求。
我的问题是,调用内部中间件的结果似乎始终是200状态代码,即使在浏览器中我得到的是404,这也让我挠头。这是我的代码供参考:
public static class AngularServerExtension
{
public static IAppBuilder UseAngularServer(this IAppBuilder builder, string rootPath, string entryPath)
{
var options = new AngularServerOptions()
{
FileServerOptions = new FileServerOptions()
{
EnableDirectoryBrowsing = false,
FileSystem = new PhysicalFileSystem(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, rootPath))
},
EntryPath = new PathString(entryPath)
};
builder.UseDefaultFiles(options.FileServerOptions.DefaultFilesOptions);
return builder.Use(new Func<AppFunc, AppFunc>(next => new AngularServerMiddleware(next, options).Invoke));
}
}
public class AngularServerMiddleware
{
private readonly AngularServerOptions _options;
private readonly AppFunc _next;
private readonly StaticFileMiddleware _innerMiddleware;
public AngularServerMiddleware(AppFunc next, AngularServerOptions options)
{
_next = next;
_options = options;
_innerMiddleware = new StaticFileMiddleware(_next, options.FileServerOptions.StaticFileOptions);
}
public async Task Invoke(IDictionary<string, object> environment)
{
IOwinContext context = new OwinContext(environment);
// try to resolve the request with default static file middleware
await _innerMiddleware.Invoke(environment);
Debug.WriteLine(context.Request.Path + ": " + context.Response.StatusCode);
// *** Right here is where I would expect a 404 but I get a 200 when debugging,
// even though my browser eventually returns a 404
// route to root path if the status code is 404
// and need support angular html5mode
if (context.Response.StatusCode == 404 && _options.Html5Mode)
{
context.Request.Path = _options.EntryPath;
await _innerMiddleware.Invoke(environment);
Console.WriteLine(">> " + context.Request.Path + ": " + context.Response.StatusCode);
}
}
}
public class AngularServerOptions
{
public FileServerOptions FileServerOptions { get; set; }
public PathString EntryPath { get; set; }
public bool Html5Mode
{
get
{
return EntryPath.HasValue;
}
}
public AngularServerOptions()
{
FileServerOptions = new FileServerOptions();
EntryPath = PathString.Empty;
}
}
根据您的问题,我不确定您是使用IIS还是自托管。如果您使用的是IIS,那么与使用owin中间件相比,有一个更干净/更快的解决方案:您可以使用IIS重写引擎,在Web配置中复制以下内容。
<system.webServer>
<rewrite>
<rules>
<!--Redirect selected traffic to index -->
<rule name="Index Rule" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_URI}" matchType="Pattern" pattern="^/api/" negate="true" />
</conditions>
<action type="Rewrite" url="/index.html" />
</rule>
</rules>
</rewrite>
...
</system.webServer>
此行允许所有文件正常提供:
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
该行允许api正常投放
<add input="{REQUEST_URI}" matchType="Pattern" pattern="^/api/" negate="true" />
其他所有内容都会获得index.html
我将spring boot security用作restful服务的ACL。安全适配器如下所示 userdetailservice的快照 我不确定是哪个部分导致了重定向。
问题内容: 我不知道执行此操作的功能,有人知道吗? 问题答案: 我发现这个例子很有帮助: https://github.com/visionmedia/express/blob/master/examples/error- pages/index.js 所以实际上是这部分:
我为重定向创建了一个简单的@Controller: 描述符是: MVC-配置在spring-mvc.xml是: webapp结构见附件: 当我运行tomcat时,它会在url上重定向我:http://localhost:8080/test/access_denied. 但是有404错误。
问题内容: 如你所知,在XML中,配置方式如下: 但是我还没有找到在Java配置中做到这一点的方法。我尝试的第一种方法是: 它似乎有效,但是在检索资源方面存在冲突。 有办法吗? 问题答案: 在Spring Framework中,有许多处理异常(尤其是404错误)的方法. 首先,你仍然可以在web.xml中使用标签,并自定义错误页面。这是一个例子。 其次,可以r对所有控制器使用一个,如下所示: 为此
问题内容: 我想配置我的Spring Boot应用程序以将任何404未找到的请求重定向到我的单页应用程序。 例如,如果我正在呼叫不存在的呼叫,则应将其重定向到。 问题是我只有一个页面react应用程序,它在根路径下运行。因此,spring应该重定向到,然后转发到(以保持路由)。 问题答案: 这应该可以解决问题:为404添加一个错误页面,该页面路由到,然后将其转发到您的SPA(假设该条目位于):
Flask类有重定向函数。调用时,它会返回一个响应对象,并将用户重定向到具有指定状态码的另一个目标位置。 函数的原型如下 - 在上述函数中 - location 参数是响应应该被重定向的URL。 statuscode 参数发送到浏览器的头标,默认为。 response 参数用于实例化响应。 以下状态代码是标准化的 - HTTP_300_MULTIPLE_CHOICES HTTP_301_MOVED