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

但显然只适用于其中一个文件名称.如何使其与多个文件名称一起使用?

最佳答案
正则表达式效率相对较低,并且当其他方法足够时,通常不鼓励使用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;

相关文章

一、Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使...
一、空格:默认匹配、普通匹配 location / { root /home; } 二、= :精确匹配(表示匹配到 /home/resou...
``` nginx -c 配置文件路径 ``` ``` /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.con...
前言 nginx可所谓是如今最好用的软件级别的负载均衡了。通过nginx的高性能,并发能力强,占用内存下的特...
1.ngnix概念 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄...
博客园从今天上午就开始报502错误 , 他的原因还不知道 , 暂时先说下我们遇到502的排查情况 最大的可能性...