我如何在Nginx地图指令中使用通配符?

我正在尝试使用Nginx来处理由Web应用程序生成的caching文件,并发现了一个潜在的问题; url空间很宽,并且会超过32000个子目录的Ext3限制。

我想分解这些子目录,比方说一个两级文件系统caching。 所以,我目前在哪里caching文件

/var/cache/www/arbitrary_directory_name/index.html 

我会把它存储在类似的东西

 /var/cache/www/a/r/arbitrary_directory_name/index.html 

我的麻烦是,我不能得到try_files ,甚至rewrite进行映射。 我在这个主题上的search使我相信我需要做这样的事情(大量缩写):

 http { map $request_uri $prefix { /aa* a/a; /ab* a/b; /ac* a/c; ... /zz* z/z; } location / { try_files /var/cache/www/$prefix/$request_uri/index.html @fallback; # or # if (-f /var/cache/www/$prefix/$request_uri/index.html) { # rewrite ^(.*)$ /var/cache/www/$prefix/$1/index.html; # } } } 

但是我不能得到/aa*模式来匹配传入的uri。 没有这个* ,它会匹配一个确切的uri,但是我不能把它匹配到前两个字符。

Nginx的文档build议应该允许使用通配符,但是我看不到让他们工作的方法。 有没有办法做到这一点? 我错过了一些简单的东西吗 或者我正在做这个错误的方式?

我怀疑globs只支持特殊的主机名模式 。 你需要使用正则expression式来实现这一点,所以你的地图应该是这样的:

 map $request_uri $prefix { ~^/aa(?<suffix>.*)$ /a/a/$suffix; ... } 

仔细阅读Nginx的文档,发现我想要的function是Rewrite模块的一部分。 我认为需要的是:

 map $request_uri $prefix { /aa* a/a; /ab* a/b; /ac* a/c; ... /zz* z/z; } 

很容易实现这个:

 if ($request_uri ~= "/(\w)(\w)(.*)") { set $prefix $1/$2; } 

然后try_files指令就像这样工作:

 location / { root /var/www/cache; try_files /$prefix$request_uri @fallback; }