NGINX 阻止位置访问并重定向到自定义错误页面

NGINX 阻止位置访问并重定向到自定义错误页面

我的 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 和图像。

如果我检查网站,原因很简单:文件的路径是错误的 - 它们基于位置(在我的例子中.githttps://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;
    }
}

我对这个地方的问题是:

  1. 我该如何修复错误路径的问题(删除路径.git)?
  2. 对于这种用例来说,这是正确的方法吗?或者有更好的解决方案吗?

答案1

首先,关于您的配置中的错误。

location ~ /(.git) { ... }

看起来你对 PCRE 正则表达式模式不太熟悉。这里不需要使用捕获组 - 捕获组用于以后需要其内容时。但是这不是一个严重错误。最糟糕的是你使用了未屏蔽的点字符,它在正则表达式模式中用作通配符。这样,你有效地阻止了任何包含第二、第三和第四个字符的字符串的 URI git(例如/agitation/index.html/any/prefix/agitation/index.html等)。这里正确的正则表达式模式将是/\.git(阻止以任何嵌套目录级别上的.git包括.gitignore等开头的任何内容)。

接下来,您将在该位置使用两个指令 -deny allreturn 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">
    

相关内容