webserver – 重写规则在NGINX中不起作用

考虑一个URL,如下所示:

http://myDomain.tld/anAddress/myFile.pdf?X=zzz&Y=kkk

我怎么能这样:

http://myDomain.tld/anAddress/myFile.pdf/zzz/kkk

我想摆脱两个?X和& Y.如果有人让我知道我应该使用什么规则,我会很高兴.

我的服务器块:

    server {
    listen 80;
        server_name _;


        location  / {
            root /my/root/path;

            rewrite ^/(.*)pdf/(.*)/(.*)$/$1?md5=$2&expires=$3 break;

            secure_link $arg_md5,$arg_expires;
            autoindex on;

            secure_link_md5 "$secure_link_expires$uri aWord";

            if ($secure_link = "") { return 403; }
            if ($secure_link = "0") { return 410; }
        }
    }

目的:更准确地说,我的网址如下:

http://myDomain.tld/anAddress/myFile.pdf?md5=So1Me2Ha3Sh4&expires=123456789

我希望它像:

http://myDomain.tld/anAddress/myFile.pdf/So1Me2Ha3Sh4/123456789

在Apache中,我们可以使用:

RewriteRule ^(.*)pdf/(.*)/(.*)$$1?md5=$2&expires=$3

当我尝试将其转换为NGINX形式时,它变为:

rewrite ^/(.*)pdf/(.*)/(.*)$/$1?md5=$2&expires=$3 break;

但它没有用.

解决方法:

在我看来,你没有捕获文件名的最后三个字符(即pdf),这意味着它们在重写的URI中缺失.

您应该尝试移动),以便将pdf作为$1的一部分捕获:

rewrite ^/(.*pdf)/(.*)/(.*)$/$1?md5=$2&expires=$3 break;

编辑:为了回应您的评论,您可以添加一个与您要拒绝的URI匹配的新位置块,例如:

location ~* \.pdf${
    return 403;
}

上述正则表达式位置块匹配以.pdf结尾的任何URI(带或不带查询字符串).有关详情,请参见this document.

上一篇:Redis持久化——RDB、AOF总结、性能建议(Which one)


下一篇:Redis-cluster 命令查看服务情况