没有静态文件 - nginx ubuntu 服务器 18.04 上的 .net 核心主机具有自定义域

No static files - .net core host on nginx ubuntu server 18.04 with custom domain

问题: 没有加载静态文件 (404)

描述: 通过反向代理在 nginx 上托管 .net 核心 MVC 应用程序。它已配置为支持带有 letsencrypts 证书的 SSL,并配置为可以通过在 sites-available 文件夹中添加配置来托管多个网站。

配置文件:

server {
        listen   80;
        listen [::]:80;
        server_name mydomain.com *.mydomain.com;

        location / {
                proxy_pass              http://localhost:5000;
                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;
                root /var/www/mydomain.com/htdocs;
        }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

尝试: 我尝试了 roottry_files 设置的不同变体。此外,尝试添加一个命名的单独 location 部分以通过 try_files 的代理绑定它。为了测试文件是否首先存在,我将 运行 curllocalhost:5000 上的文件位置,它肯定存在。

当前状态:访问域时站点确实加载,但它为每个静态文件抛出 404。我在应用程序的配置部分 app.UseStaticFiles(); 所以没有丢失。

这是因为您只指定了 1 条规则作为反向代理,即使您指定了 root 属性,它也永远不会被使用。 我们需要做的是使用 2 条规则,一条处理来自另一条的 404:

server {
    listen   80;
    listen [::]:80;
    server_name mydomain.com *.mydomain.com;

    location / {
        root /var/www/mydomain.com/htdocs;
        error_page 404 @app;
    }

    location @app {
        proxy_pass              http://localhost:5000;
        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;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

之所以配置为使用应用程序作为静态文件的后备而不是使用静态文件作为应用程序的后备,是因为如果应用程序有一些代码不是 404 的自定义 404 页面,则静态文件将不会被使用。

然后您就可以从您的应用程序中删除 UseStaticFiles