我正在尝试使用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; }