Nginx 重写的多个条件

Nginx 重写的多个条件

我正在尝试找到重写此规则的最佳方法,以便它可以在 nginx 上运行:

   RewriteCond %{REQUEST_URI} !^/clip-art/.*$
   RewriteCond %{REQUEST_URI} !^/Clip-Art/.*$
   RewriteCond %{REQUEST_URI} !^/cgi-bin/.*$
   RewriteCond %{REQUEST_URI} !^/images/.*$
   RewriteCond %{REQUEST_URI} !/invitation/
   RewriteCond %{REQUEST_URI} !/designer/
   RewriteRule ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 [r=301,nc,l]

我知道我可以做类似的事情:

   if ($request_uri !~ "/designer") {
       rewrite ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 permanent;
   }

但显然这只适用于其中一个文件夹名称。如何让它适用于多个文件夹名称?

答案1

正则表达式效率相对较低,当其他方法就足够时,通常不建议在 Nginx 配置中使用正则表达式。以下几种情况不需要正则表达式:

location /clip-art/ {
    # ...
}

location /Clip-Art/ {
    # ...
}

location /images/ {
    # ...
}

location /cgi-bin/ {
    # ...
}

如果您仅从至少三个目录中提供静态图像,我们可以使其更简单。^~前缀表示这些规则将优先于基于正则表达式的规则,否则基于正则表达式的规则将优先。虽然这有很多用途,但它可以在处理仅包含静态资源的目录时充当安全功能。如果有人设法上传通常由正则表达式位置处理的 PHP 文件或其他可执行代码,则预正则表达式位置(带有^~)将获胜,并且文件将不会被执行。我还省略了典型,$uri/因为它并不真正适用于静态资源目录。

location ^~ /clip-art/ { try_files $uri =404; }
location ^~ /Clip-Art/ { try_files $uri =404; }
location ^~ /images/   { try_files $uri =404; }

location /cgi-bin/ {
    # ...
}

至于其余条件,Nginx 被设计为从每个 URI 的开头开始匹配。理想情况下,您可以在应用程序中处理这些类型的场景,而不是在 Nginx 中。但是,在这个特定实例中,可以编写一个相对有效的正则表达式:

rewrite "^((?:/(?!designer|invitation)[^/]+){4})/?$" /clip-art$1 permanent;

答案2

https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word包含如何使用正则表达式查找不包含某些单词的字符串的示例。

在您的指令中使用此正则表达式方法location,然后在块rewrite内使用您的语句location

此外,我建议您在指令中使用.+(一个或多个匹配)而不是.*(零个或多个匹配)作为通配符rewrite

相关内容