我想请求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
)。