我有两个ASP.NET核心应用程序。一个是Headless CMS (API),另一个是Razor Pages博客前端(带有一个与Headless CMS/API通信的REST客户端)。
然后我就有了一个Azure AKS集群。在其中,我有一个入口资源,其中包含以下路由(根据以下AKS文档中的说明:https://docs.microsoft.com/en-us/azure/aks/ingress-tls#create-an-ingress-route )。每个路由映射到上面提到的每个应用程序/服务:
spec:
rules:
- host: mydomain.westeurope.cloudapp.azure.com
http:
paths:
- backend:
serviceName: headless-cms-svc
servicePort: 80
path: /
- backend:
serviceName: blog-svc
servicePort: 80
path: /blog当我现在导航到第一个路径,mydomain.westeurope.cloudapp.azure.com,无头CMS应用程序可以正常工作,但是当我导航到第二个路径,mydomain.westeurope.cloudapp.azure.com/blog,我得到了一堆404:s,因为博客应用程序的根路径现在是相对于/blog入口路径,这反过来又破坏了wwwroot文件夹中的所有资源(css,javascript,图像等)。
我应该如何配置我的ASP.NET核心博客应用和/或我的入口对象?
404:s
https://mydomain.westeurope.cloudapp.azure.com/css/site.min.css?v=kHvJwvVAK1eJLN4w8xygUR3nbvlLmRwi5yr-OuAO90E
https://mydomain.westeurope.cloudapp.azure.com/images/banner1.svg
https://mydomain.westeurope.cloudapp.azure.com/images/banner2.svg
https://mydomain.westeurope.cloudapp.azure.com/js/site.min.js?v=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU如果我添加URL段/blog,资源将得到正确的服务。https://mydomain.westeurope.cloudapp.azure.com/blog/images/banner1.svg <- works
下面是Index.cshtml剃刀页面中的常规img标签(来自默认的ASP.NET Core2.1剃刀页面web应用程序)。我没有更改代码中的任何内容。
<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />发布于 2018-09-21 21:55:37
问题
看起来你的代理重写了路径。
proxy之前的代理: /blog/images/banner1.png
Asp生成绝对(主机相对)链接(仅限路径,但以斜杠“/”开头)。这意味着,我们必须告诉框架,它必须为所有URL加上"/blog“前缀。
解决方案
通过在启动类中插入以下代码片段来执行此操作(适用于asp.net核心2.1):
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/blog");
return next();
});代码示例来自:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1
在您的Configure方法中,将这段代码插入到任何其他中间件之前。
你也可以在你的本地机器上测试它。所有生成的链接都应该以"/blog“为前缀-这样它们在你的开发机器上就会被破坏。
使用配置
您需要将其设置为可配置,例如:
var basePath = Configuration.GetSection("BASE_PATH").Value;
if (basePath != null)
{
Console.WriteLine($"Using base path '{basePath}'");
// app.Use().. goes here
}(假设您在启动时从env vars读取配置。)
…并在kubernetes仓库中提供此env var:
...
containers:
- name: myapp
image: myappimage
env:
- name: BASE_PATH
value: "/blog"发布于 2018-09-20 09:05:43
你想用nginx.ingress.kubernetes.io/rewrite-target注释你的入口。例如:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: mydnsname.westeurope.cloudapp.azure.com
http:
paths:
- backend:
serviceName: headless-cms-svc
servicePort: 80
path: /
- backend:
serviceName: blog-svc
servicePort: 80
path: /blog希望它能帮上忙!
发布于 2019-07-26 09:45:05
按照以下步骤运行代码:
在k8s-yaml-file中使用路径基的
apiVersion: apps/v1
kind: Deployment
# ..
spec:
# ..
template:
# ..
spec:
# ..
containers:
- name: test01
image: test.io/test:dev
# ...
env:
# define custom Path Base (it should be the same as 'path' in Ingress-service)
- name: API_PATH_BASE # <---
value: "blog"中启用加载环境参数
var builder = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
// ..
.ConfigureAppConfiguration((hostingContext, config) =>
{
// ..
config.AddEnvironmentVariables(); // <---
// ..
})
// ..中应用UsePathBaseMiddleware
public class Startup
{
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
private readonly IConfiguration _configuration;
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var pathBase = _configuration["API_PATH_BASE"]; // <---
if (!string.IsNullOrWhiteSpace(pathBase))
{
app.UsePathBase($"/{pathBase.TrimStart('/')}");
}
app.UseStaticFiles(); // <-- StaticFilesMiddleware must follow UsePathBaseMiddleware
// ..
app.UseMvc();
}
// ..
}https://stackoverflow.com/questions/52404475
复制相似问题