在 nginx 中提供静态网站,静态文件的路径错误

Serving static website in nginx, wrong path for static files

我正在尝试使用 nginx 为提供给我的静态网站提供服务。它的文件夹结构是这样的:

static_website/
    index.html
    www.example.com/
    resources.example.com/
    uploads.example.com/

根目录中的 index.html 文件是由 httrack 生成的文件,它只包含指向 www.example.com/index.html 的重定向。 www.example.com文件夹里面是所有的html文件,另外两个文件夹是cssjavascriptimage文件。

这里是 nginx 配置:

server {
    index index.php index.html index.htm;

    server_name example.com;

    location / {
        root /var/www/static_website/www.example.com;
        try_files $uri $uri/ =404;
        index index.html;
    }

}

我可以浏览页面,但 css、javascript 和图像文件未加载。 html 中 css 文件之一的路径如下所示:

href="../resources.example.com/style.css"

我设法使它工作的唯一方法是让 url 像这样:

example.com/www.example.com/

这样,所有的路径都是正确的。我想避免这种情况,只需 example.com。 有办法吗?

看起来该站点最初是为了使用 //example.com/www.example.com/.

这样丑陋的 URL 来运行的

但是资源的路径相对 URI 相对于 / 应该工作得很好,您只需要提供一个匹配 /resources.example.com/.[=16= 的 location 块]

例如:

location / {
    root /var/www/static_website/www.example.com;
    try_files $uri $uri/ =404;
    index index.html;
}
location /resources.example.com/ {
    root /var/www/static_website;
}

我最初评论说你应该试试这个:

location ~ \.(css|js|jpg|png|svg)$ { 
    root /var/www/static_website;
}

这实现了类似的目标,但 Nginx 处理前缀位置比正则表达式位置更有效。

我想与遇到类似问题的其他人分享我对这个问题的经验,因为解决方案对我来说不是那么明显

我的设置和问题尤其与 cloudlflare 设置有关,我使用它来利用 TLS,而不是在我的 2 个站点之一的原始服务器上处理它。如果您从支持加密的 CDN 为您的网站提供服务,并且您在源站上使用 nginx,请考虑以下设置:

# static1.conf
{ server_name static1.com; root: /var/www/static1/public; listen 80; listen 443; }

# static2.conf - no tls setup in nginx, figured id let cloudflare handle it
{ server_name static2.com; root: /var/www/static2/public; listen 80; }

static1 在源头设置了 letsencrypt 来处理 tls 连接

static2 是在原点设置的,没有任何 tls 配置

从左到右,这里是适当的 cloudlfare TLS 模式,它允许我通过 nginx 访问正确的文件

fullflexible 之间的区别在于 full 模式让源处理证书。

最初我将 static2 站点错误配置为完整站点,它缺少 443 的侦听指令导致 nginx 改为服务 static1。

我意识到最初的问题与 cdn 或 cloudflare 无关,但这个方案/协议不匹配让我花了几个小时,我希望让其他人免于类似的悲伤

老实说,我很惊讶 nginx 没有坚持匹配 server_name 并且即使没有指定 default_server oit 隐式匹配方案作为后备(或至少看起来是这样) - 和日志中没有任何有意义的消息可以启动!调试 nginx 有时是一场噩梦。