我的 NGINX 设置存在问题,如果需要抛出错误页面,则会重定向到另一个位置的自定义错误页面(包括 css、图像、js)。
首先,我想阻止对文件夹的访问(例如.git
)。这可以通过(在服务器块内)轻松完成
location ~ /(.git) {
deny all;
return 404;
}
然后,我创建了一个自定义 error_page 元素(在服务器块内),并在与网站根目录不同的位置创建了一个自定义 404.html 文件。
error_page 404 /404.html;
location = /404.html {
root /var/data/websites/error-page;
internal;
}
经过这些更改后,将显示我的自定义 404 页面 - 但不包含 css、js 和图像。
如果我检查网站,原因很简单:文件的路径是错误的 - 它们基于位置(在我的例子中.git
)
https://it.dmetzler1988.io/.git/css/main.css net::ERR_ABORTED 404
。
以下是此页面的完整 NGINX 配置文件(仅删除了 SSL 证书路径):
server {
listen 443 ssl;
listen [::]:443 ssl http2;
ssl_certificate <path>;
ssl_certificate_key <path>;
server_name it.dmetzler1988.io;
root /var/data/websites/dmetzler1988.io/it.dmetzler1988.io;
index index.html index.php;
error_page 404 /404.html;
location = /404.html {
root /var/data/websites/error-page;
internal;
}
location ~ /(.git) {
deny all;
return 404;
}
}
我对这个地方的问题是:
- 我该如何修复错误路径的问题(删除路径
.git
)? - 对于这种用例来说,这是正确的方法吗?或者有更好的解决方案吗?
答案1
首先,关于您的配置中的错误。
location ~ /(.git) { ... }
看起来你对 PCRE 正则表达式模式不太熟悉。这里不需要使用捕获组 - 捕获组用于以后需要其内容时。但是这不是一个严重错误。最糟糕的是你使用了未屏蔽的点字符,它在正则表达式模式中用作通配符。这样,你有效地阻止了任何包含第二、第三和第四个字符的字符串的 URI git
(例如/agitation/index.html
,/any/prefix/agitation/index.html
等)。这里正确的正则表达式模式将是/\.git
(阻止以任何嵌套目录级别上的.git
包括.gitignore
等开头的任何内容)。
接下来,您将在该位置使用两个指令 -deny all
和return 404
。这里只需使用其中一个就足够了 - 要么deny all
(returning HTTP 403 Forbidden
) 要么return 404
(returning HTTP 404 Not Found
)。您得到 404 而不是 403 的原因是该return
指令在REWRITE
请求处理阶段执行,而deny
另一个指令在后面的ACCESS
阶段执行(请求处理阶段在开发指南)。
现在回到你的问题。看起来你正在使用相对 URI 路径引用你的资产,例如
<link rel="stylesheet" type="text/css" href="css/main.css">
您的一些选择包括(但不限于):
将每个资产嵌入到错误处理程序 HTML 中(包括您的图片,您可以将图片编码为 BASE64,然后使用数据 URI(英文):
将所有资产移动到主站点 webroot 下的某个文件夹中(说
/var/data/websites/dmetzler1988.io/it.dmetzler1988.io/assets/errors
并使用完整路径引用它们:<link rel="stylesheet" type="text/css" href="/assets/errors/css/main.css">