请教下各位,如何能根据请求动态的修改 root 目录;

2017-05-10 16:46:02 +08:00
 djhuahao
比如,当我希望访问 www.1.com/123 则 root 目录变为 /data/123,相应的访问 www.1.com/456 那么 root 目录也会变成 /data/456
谢谢大家。
4489 次点击
所在节点    NGINX
12 条回复
a282810
2017-05-10 18:23:22 +08:00
根据记忆写的,楼主自行测试

location /123/ {
alias /data/123/;
}



location /123/ {
root /data/;
}
ryd994
2017-05-11 05:05:36 +08:00
1. 如果是要 www.1.com/123 -> /data/123 的话,不需要配置,本来就是
2. 如果是要 www.1.com/123 -> /data/123/123 的话:
location ~ ^/(.*)/.* {
root /data/$1;
}
我没测试过不过就是这么个意思,regex 捕捉
另外还可以 named capture,语法自己搜 nginx named capture
djhuahao
2017-05-11 10:05:40 +08:00
@a282810 不好意思我可能没说清楚,用户 /后面输入的信息是未知的。也就是可能是 /123 /456 又或者其他。
djhuahao
2017-05-11 10:06:37 +08:00
@ryd994 这个我测试这了并不生效,不知道是不是$1 不是全局变量的原因。感谢您的回复。
ryd994
2017-05-11 10:10:49 +08:00
@djhuahao 你先解释一下你要的到底是什么,因为你的例子看起来很奇怪
如果是我说的情况 1 的话,那不需要任何特别配置
ryd994
2017-05-11 10:21:12 +08:00
root 目录的意思是
www.1.com/123/abc.file -> /data/123/abc.file
按你的字面意思是
www.1.com/123/abc.file -> /data/123/123/abc.file

我给的 match 不生效的话,reload 了么?以及我是假设路径总是超过两级
djhuahao
2017-05-11 15:26:53 +08:00
@ryd994 是这样的,我现在开放了 /data 目录给用户上传文件夹,文件夹的命名我并不知道,但是都以 x 编号开头。
所以我只能识别用户网址后的 /路径并跳转到相应的 root 目录里。比如 www.123.com/x666 跳到 root 目录为 /data/x666/file

server {
server_name www.123.com;
set $root /data;
if ($host ~* ^/(.*)) { set $root $root/$1; }
root $root;
}

我尝试了以上的方法能够实现修改 root 目录为 /data/x666,却不能跳转到 /data/x666/file
也就是说 if ($host ~* ^/(.*)) { set $root $root/$1/file; } 不生效。

还请指点,谢谢。
ryd994
2017-05-11 15:55:16 +08:00
@djhuahao 因为你这配置就是错的
if is evil
你对 root 的理解有误
root /data/ 就够了
因为根后面接的是 url,也就是说 example.com/123/abc.file -> /data/123/abc.file
这就是自然状态

至于你说不能跳转,问题未必是这个,error log 呢?
djhuahao
2017-05-11 16:17:35 +08:00
@ryd994 因为我有特殊需求,对于用户来说我的路径是隐藏的,所以只是希望用户输入 /123 时候 root 目录自动的对应(因为目录里已经有主页文件了),前端就只是会显示 example.com/123 从而显示出首页。
ryd994
2017-05-11 16:44:49 +08:00
@djhuahao 只写 root /data/的话
example.com/123/ 显示的就是 /data/123/index.html
否则那么多静态站岂不是麻烦死了?
a282810
2017-05-11 18:22:40 +08:00
如果 /data 目录下的文件夹的命名是有规律的,可以匹配的到那就直接用正则
比如:
location ~ ^/x(.*) {
root /data;
}
djhuahao
2017-05-12 10:21:46 +08:00
@a282810 恩,这个我是明白的,只是我的目录里还有一层,就是 /data/未知 /file 要匹配中间那个 x 开头的未知文件夹。谢谢您的回复。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX