【问题标题】:.NET 5.0 Web Applications deployed on Nginx(Ubuntu) not serving static files correctly部署在 Nginx(Ubuntu) 上的 .NET 5.0 Web 应用程序无法正确提供静态文件
【发布时间】:2021-12-30 00:16:51
【问题描述】:

我在 Ubuntu 服务器(使用 Nginx)上部署了三个 .NET 5 Web 应用程序(1 个 Razor 页面、1 个 MVC、1 个 Web API),我希望它们的路径像这样工作:

..但我在提供静态文件时遇到了几个问题(到目前为止在 MVC 应用程序上)

平台应用配​​置

程序.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
            webBuilder.UseUrls("http://localhost:8002");
            webBuilder.UseStartup<Startup>();
        });

Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseStaticFiles();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
        app.UseStaticFiles("/platform");
        app.UsePathBase("/platform");
    }
  
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
    });

    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

nginx 配置

server {
    listen        80;
    server_name   domain.azure.com *.domain.azure.com;

    location /homepage/ {
        proxy_pass         http://127.0.0.1:8001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
    
    location /platform/ {
        proxy_pass         http://127.0.0.1:8002;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

    location /apis/ {
        proxy_pass         http://127.0.0.1:8003;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

我对 MVC 应用程序上的静态文件有两个问题:

问题 1

当操作是索引时,例如/administration,服务器正确加载图片如下:domain.azure.com/platform/assets/images/header.png

但是当试图访问控制器中不是索引的动作时(例如/administration/users),服务器会尝试像domain.azure.com/platform/administration/assets/images/header.png那样加载背景图像。

问题 2

另一个问题是我在 MVC 应用程序上的 Identity Razor 页面,其中服务器忽略 platform 路径并尝试从域相对 URL 提供页面,例如domain.azure.com/Identity/Account/Login 而不是 domain.azure.com/platform/Identity/Account/Login

你能告诉我我的配置是否遗漏了什么吗?

谢谢

【问题讨论】:

  • 嗨。你能解决这个问题吗?我面临着完全相同的问题。谢谢。
  • 嗨,事实证明我的设置是正确的,但我在链接引用上遇到了一些问题。我通过在我的视图和 css 文件中使用相对 url 来修复静态文件问题,如下所示: background-image: url(../assets/images/image.jpg) 或 ~/assets/images/logo.png (取决于在您的情况下).. 以及对于剃须刀页面,我使用了这样的网址:“~/Identity/Account/Login”。
  • 是的,完全正确:D 我用同样的方法修复了。此外,还需要添加 UsePathBase 中间件。我将发布解决方案以供以后使用:)

标签: c# asp.net-mvc asp.net-core nginx razor-pages


【解决方案1】:

要使 asp.net 核心与代理服务器(nginx/apache 等)一起工作,最好使用称为相对 url 的东西: 在应用程序中的任何位置编写路径时,请在开头使用 tilda (~) 字符。例如:

&lt;style src="~/assets/js/app.js"&gt;&lt;script&gt;

在这个url之后,需要通过添加PathBaseMiddleware添加

app.UsePathBase("/myprefix")

great article by microsoft 专门讨论这个问题。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2018-11-19
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2018-08-10
    • 2021-11-25
    • 2015-08-10
    相关资源
    最近更新 更多