【发布时间】:2015-08-03 18:50:26
【问题描述】:
我在设置条件重写时遇到问题,我一直在尝试使用 if 指令(尽管所有来源都表明它是“邪恶的”)和 -f 开关来检查是否存在文件,但它不起作用。我相信这个问题/案例最好通过例子来解释,所以这里是:
目录结构
workspace/
myapp/
webroot/
index.php
assets/
baz.js
hello/
foo.js
modules/
hello/
assets/
foo.js
bar.js
预期结果
/ => /workspace/myapp/webroot/index.php
/assets/hello/foo.js => /workspace/myapp/webroot/assets/hello/foo.js
/assets/hello/bar.js => /workspace/myapp/modules/hello/assets/foo.js
/assets/baz.js => /workspace/myapp/webroot/assets/baz.js
总结:
-
foo.js仅存在于modules/hello/assets文件夹中,并从那里传递。 -
bar.js存在于webroot/assets/hello和modules/hello/assets中,并从webroot传递。 (它隐藏/覆盖modules中的文件) -
baz.js仅存在于webroot/assets中并从那里交付。
现在不起作用的部分是:
location /assets/ {
if (-f $uri) {
break;
}
root /workspace/myapp/modules;
rewrite ^/assets/([^/]+)/(.*)$ /$1/assets/$2 break;
}
即if 指令,似乎没有任何影响-bar.js 文件是从modules 而不是webroot 传递的。
我应该使用if 还是不使用?
有什么办法可以用try_files 来解决这个问题吗?我似乎无法理解这将如何与我似乎无法解决的 rewrite 一起工作。
请不要建议使用部署脚本或其他方式重新组织资产 - 由于各种其他原因,这不是一种选择。
我之前在 Apache 上使用过这种模式,NGINX 似乎在大多数方面都更强大,所以我确定这一定是可能的?
一个不是绝对的要求是我没有有能够用webroot/assets/hello/foo.js 覆盖modules/hello/assets/foo.js - 但是从webroot/assets/* 提供脚本是一项要求。 p>
【问题讨论】:
-
你的重写应该使用标志
last而不是break