我正在尝试找到重写此规则的最佳方法,以便它可以在 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;
}
但显然这只适用于其中一个文件夹名称。如何使它与多个文件夹名称一起使用?
当其他方法足够时,正则表达式的效率相对较低,并且通常不鼓励在 Nginx 配置中使用。这里有一些不需要正则表达式的情况:
如果您只是从其中至少三个中提供静态图像,我们可以让它变得更简单。前缀意味着这些
^~
规则将优先于基于正则表达式的规则,否则将优先。虽然这有很多用途,但在处理仅包含静态资源的目录时,它可以作为一种安全功能。如果有人设法上传 PHP 文件或其他通常由正则表达式位置处理的可执行代码,则预正则表达式位置(带有^~
)将获胜,并且该文件将不会被执行。我也省略了典型$uri/
的,因为它并不真正适用于静态资源目录。至于其余的条件,Nginx 设计为从每个 URI 的开头开始匹配。理想情况下,您可以在应用程序中处理这些类型的场景,而不是在 Nginx 中。但是,在这种特定情况下,可以编写一个相对有效的正则表达式:
https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word包含如何使用正则表达式查找不包含某些单词的字符串的示例。
在您的指令中使用此正则表达式方法
location
,然后在块rewrite
内使用您的语句。location
此外,我建议您在指令中使用
.+
(一个或多个匹配项)而不是.*
(零个或多个匹配项)作为您的通配符。rewrite