在 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
文件,另外两个文件夹是css
、javascript
和image
文件。
这里是 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 访问正确的文件
full 和 flexible 之间的区别在于 full 模式让源处理证书。
最初我将 static2 站点错误配置为完整站点,它缺少 443 的侦听指令导致 nginx 改为服务 static1。
我意识到最初的问题与 cdn 或 cloudflare 无关,但这个方案/协议不匹配让我花了几个小时,我希望让其他人免于类似的悲伤
老实说,我很惊讶 nginx 没有坚持匹配 server_name 并且即使没有指定 default_server oit 隐式匹配方案作为后备(或至少看起来是这样) - 和日志中没有任何有意义的消息可以启动!调试 nginx 有时是一场噩梦。
我正在尝试使用 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
文件,另外两个文件夹是css
、javascript
和image
文件。
这里是 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/
.
但是资源的路径相对 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 访问正确的文件
full 和 flexible 之间的区别在于 full 模式让源处理证书。
最初我将 static2 站点错误配置为完整站点,它缺少 443 的侦听指令导致 nginx 改为服务 static1。
我意识到最初的问题与 cdn 或 cloudflare 无关,但这个方案/协议不匹配让我花了几个小时,我希望让其他人免于类似的悲伤
老实说,我很惊讶 nginx 没有坚持匹配 server_name 并且即使没有指定 default_server oit 隐式匹配方案作为后备(或至少看起来是这样) - 和日志中没有任何有意义的消息可以启动!调试 nginx 有时是一场噩梦。