NGINX 针对不同文件夹上的特定上传文件

NGINX target specific upload files on different folders

我需要为多个特定的上传文件添加一个noindex标签,但它们都属于不同的年月上传文件夹,例如:

我最初是这样做的,但没有成功:

location ~ "^(.*)/app/uploads/(.*)$" {
    location ~ ^/(file-1.pdf|file-2.pdf|file-3.pdf)$ {
        add_header X-Robots-Tag "noindex";
    }
}

我还没有访问权限来测试,但这是我打算做的:

location ~ "/var/www/public/app/uploads/(.*)$" {
    location ~ ^/(file-1.pdf|file-2.pdf|file-3.pdf)$ {
        add_header X-Robots-Tag "noindex";
    }
}

我想知道是否有更好的方法,或者这是否有效。现在有 27 个特定文件我必须这样做,所以我不确定 file-1.pdf|file-2.pdf|file-3.pdf 是否是我的最佳选择。

感谢任何帮助,谢谢。

首先,你肯定是错误地使用了location指令。假设您的服务器根目录是 /var/www/public/app 并且您的示例请求是 http://example.com/uploads/2021/06/file-1.pdf 规范化 URI(需要检查 locationrewrite 指令)将是 /uploads/2021/06/file-1.pdf。将捕获这些请求并添加所需 header 的位置示例是

location ~ ^/uploads/(?<file>.*) {
    if ($file ~ ^(?:2021/06/file-1\.pdf|2018/11/file-2\.pdf|2011/07/file-3\.pdf))$ {
        add_header X-Robots-Tag "noindex";
    }
}

这里的(?<file>.*)是so-callednamed capture group以备后用。也可以使用两个嵌套位置:

location /uploads/ {
    location ~ /(?:2021/06/file-1\.pdf|2018/11/file-2\.pdf|2011/07/file-3\.pdf)$ {
        add_header X-Robots-Tag "noindex";
    }
}

您也可以使用 map 指令(虽然我不知道这是否可以称为“更好的方法”):

map $file $robots {
    2021/06/file-1.pdf    noindex;
    2018/11/file-2.pdf    noindex;
    2011/07/file-3.pdf    noindex;
    # default value will be an empty string
}

server {
    ...
    location ~ ^/uploads/(?<file>.*) {
        add_header X-Robots-Tag $robots;
    }
    ...
}

或没有正则表达式:

map $uri $robots {
    /uploads/2021/06/file-1.pdf    noindex;
    /uploads/2018/11/file-2.pdf    noindex;
    /uploads/2011/07/file-3.pdf    noindex;
    # default value will be an empty string
}

server {
    ...
    location /uploads/ {
        add_header X-Robots-Tag $robots;
    }
    ...
}

如果 add_header 指令的第二个参数为空字符串,则它不会向响应添加 header。

您还应该注意 this 文档摘录:

These directives are inherited from the previous configuration level if and only if there are no add_header directives defined on the current level.