Nginx重写的多个条件

我试图find最好的方法来重写这个规则,所以它将在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; } 

但显然这只适用于其中一个文件夹名称。 我如何使它与多个文件夹名称一起工作?

正则expression式在Nginxconfiguration中是相对低效的,而且在其他方​​法足够的情况下通常是不鼓励的。 这里有几个例子不需要正则expression式:

 location /clip-art/ { # ... } location /Clip-Art/ { # ... } location /images/ { # ... } location /cgi-bin/ { # ... } 

如果您只是提供其中至less三个静态图像,我们可以使它更简单。 ^~前缀表示这些规则将优先于基于正则expression式的规则,否则将优先考虑。 虽然这有很多用途,但在处理仅包含静态资源的目录时,它可以充当安全function。 如果有人设法上传一个PHP文件或其他可执行代码,通常由正则expression式位置处理,则正则expression式位置(使用^~ )将会胜出,并且文件将不会被执行。 我也省略了典型的$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的devise就是从每个URI的开头开始匹配。 理想情况下,您可以在应用程序中处理这些场景,而不是在Nginx中。 然而,在这个特定的例子中,可以写出一个相对有效的正则expression式:

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

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

在你的location指令中使用这种正则expression式的方法,然后在location块内使用你的rewrite语句。

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