【问题标题】:NGINX target specific upload files on different foldersNGINX 针对不同文件夹上的特定上传文件
【发布时间】:2021-09-20 05:22:49
【问题描述】:

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

  • /var/www/public/app/uploads/2021/06/file-1.pdf
  • /var/www/public/app/uploads/2018/11/file-2.pdf
  • /var/www/public/app/uploads/2011/07/file-3.pdf

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

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 是否是我的最佳选择。

感谢您的帮助。

【问题讨论】:

    标签: nginx nginx-config nginx-location noindex


    【解决方案1】:

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

    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";
        }
    }
    

    这里的(?&lt;file&gt;.*) 是所谓的named 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 指令的第二个参数为空字符串,则不会在响应中添加标头。

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

    当且仅当当前级别上没有定义add_header 指令时,这些指令才从先前的配置级别继承。

    【讨论】:

    • 啊,谢谢!我认为我需要为它使用整个目录——第一个解决方案对我来说效果很好,只是它缺少 if 条件的右括号。我更喜欢使用map,因为它更易于管理,但它为我提供了nginx: [emerg] unknown "file" variable
    • 哦,对不起,这是一个常规的复制粘贴错误,当然我们应该在第二个map 示例中检查$uri 变量。我同意它看起来比其他示例更易于管理。
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 2016-05-23
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多