花了几个小时试图找出问题所在,但是很好。
这是我想要实现的目标:
当用户请求js文件时,我想检查共享内存中是否存在uglified copy,如果有,则提供服务。如果没有uglified副本,我想提供常规文件。
以下是我的位置:
location ~/require/[a-z0-9]+/(.*) {
try_files /dev/shm/uglified/$1 /public/javascripts/$1;
}
如您所见,如果用户要求提供文件/require/fe45be18b99f9099efbc98a71f67924aef72d58a/app/require-config.js
我们应该检查文件/dev/shm/uglified/app/require-config.js
是否存在并提供服务。
如果文档未在1中提供,则从app/require-config.js
位置投放文件/public/javascripts/
。
嗯,它看起来很简单,但不起作用。
所有文件都存在于dev/shm
和public
位置。
可是:
永远不会提供来自dev/shm
文件夹的文件,无论此位置是否位于try_files指令中的第二位。
仅提供public
位置的文件,如果它位于try_files指令的第二位。
e.g。 try_files /dev/shm/uglified/$1 /public/javascripts/$1;
有效
try_files /public/javascripts/$1 /dev/shm/uglified/$1;
不起作用,虽然我只是在指令中更改位置。
有人可以建议为什么来自/ dev / shm的文件从未被选中,为什么try_files指令中的位置顺序很重要?
答案 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;
}