我试图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;
在你的location指令中使用这种正则expression式的方法,然后在location块内使用你的rewrite语句。
此外,我build议你在rewrite指令中使用.+ (一个或多个匹配)而不是.* (零个或多个匹配)作为通配符。