Nginx try_files指令很奇怪

时间:2017-07-12 20:48:46

标签: nginx

花了几个小时试图找出问题所在,但是很好。

这是我想要实现的目标:

当用户请求js文件时,我想检查共享内存中是否存在uglified copy,如果有,则提供服务。如果没有uglified副本,我想提供常规文件。

以下是我的位置:

location ~/require/[a-z0-9]+/(.*) {
   try_files /dev/shm/uglified/$1 /public/javascripts/$1;
}

如您所见,如果用户要求提供文件/require/fe45be18b99f9099efbc98a71f67924aef72d58a/app/require-config.js

  1. 我们应该检查文件/dev/shm/uglified/app/require-config.js是否存在并提供服务。

  2. 如果文档未在1中提供,则从app/require-config.js位置投放文件/public/javascripts/

  3. 嗯,它看起来很简单,但不起作用。 所有文件都存在于dev/shmpublic位置。

    可是:

    1. 永远不会提供来自dev/shm文件夹的文件,无论此位置是否位于try_files指令中的第二位。

    2. 仅提供public位置的文件,如果它位于try_files指令的第二位。

    3. e.g。 try_files /dev/shm/uglified/$1 /public/javascripts/$1;有效

      try_files /public/javascripts/$1 /dev/shm/uglified/$1;不起作用,虽然我只是在指令中更改位置。

      有人可以建议为什么来自/ dev / shm的文件从未被选中,为什么try_files指令中的位置顺序很重要?

1 个答案:

答案 0 :(得分:0)

感谢@Richard Smith的评论,我发现了如何让它发挥作用:

#that's the basic location, where we just redirect request to /dev/shm/ location
location ~/require/[a-z0-9]+/(.*) {
    echo_location /dev/shm/uglified/$1;
}

#that's location to serve files from shared memory
location ~ ^/dev/shm/uglified/(.*) {

    #set the root
    root /dev/shm/uglified/;

    #try file in this file, if it does not exist, redirect to public location
    try_files /$1 /public/javascripts/$1;

}