尝试使用Nginx的try_files来模拟Apache MultiViews

我想请求http://example.com/foobar返回http://example.com/foobar.jpg 。 (或.gif,.html,.whatever)

这对Apache MultiView来说是微不足道的,在Nginx中看起来也是一样的。 这个问题似乎意味着它会很容易,因为try_files $uri $uri/ index.php; 在位置块,但这是行不通的。

try_files $uri $uri/ =404; 不起作用,也不try_files $uri =404; 或者try_files $uri.* =404; 在我的location / {块和匹配图像的正则expression式之间移动它没有任何影响。

至关重要的是, try_files $uri.jpg =404; 可以工作,但只适用于.jpg文件,如果在位置块中使用多个try_files规则,则会引发configuration错误!

当前server { block:

 server { listen 80; server_name example.org www.example.org; access_log /var/log/nginx/vhosts.access.log; root /srv/www/vhosts/example; location / { root /srv/www/vhosts/example; } location ~* \.(?:ico|css|js|gif|jpe?g|es|png)$ { expires max; add_header Cache-Control public; try_files $uri =404; } } 

Nginx的版本是1.1.14。

您可以通过传递各种文件名尝试try_files来模拟Apache的MultiViews。

Nginx的try_files指令正是名字所暗示的 – 它以指定的顺序尝试文件,如果没有find,将移动到下一个文件。 通常情况下,最后一个条目是保证可以工作的回退 – 命名的位置块或错误页面。

try_files的常见参数: $uri$uri/真的是传递给nginx的path – 带和不带尾部的斜线。

所以,如果你去example.com/path/to/myfile

 $uri = /path/to/myfile $uri/ = /path/to/myfile/ 

使用try_files $uri $uri/指令,nginx会尝试正确地传递( $uri ) – 如果这个文件存在,将会提供它,否则会尝试find一个匹配的目录( $uri/ )并将其用于无论您指定了哪个索引)。

由于您尝试提供的文件实际上并不匹配$uri中的path,因此您需要将扩展​​名追加到$uri中才能使用:

$uri.jpg将匹配(从上面的例子) myfile.jpg – 因此,当你使用它时只有JPEG工作。

既然你可以指定多个文件在try_files进行尝试,那么有多个try_files指令并不合理,这就是为什么它是不允许的。

因此,按照最简单的forms,按照您想要尝试的顺序列出您想要的文件(例如):

 try_files $uri.jpg $uri.gif $uri.png $uri.css $uri.js $uri/ =404 

第二个地址块在这种情况下很有趣。 通常情况下,nginx将只处理一个位置块 – 最匹配的位置块。 但是,在rewrite ... last的情况下, rewrite ... last处理将重新开始并检查所有可用的位置块。 这基本上是try_files – 检查是否存在并rewrite ... last ,关键的区别是没有通过try_files剥离的参数,除非明确地添加(例如使用$uri?$args )。