技术解析

请教下各位,如何能根据请求动态的修改 root 目录;
0
2021-05-21 01:15:30
idczone
比如,当我希望访问 www.1.com/123 则 root 目录变为 /data/123,相应的访问 www.1.com/456 那么 root 目录也会变成 /data/456
抗投诉服务器谢谢大家。
根据记忆写的,楼主自行测试
location /123/ {
alias /data/123/;
}

location /123/ {
root /data/;
}

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

不好意思我可能没说清楚,用户 /后面输入的信息是未知的。也就是可能是 /123 /456 又或者其他。

这个我测试这了并不生效,不知道是不是$1 不是全局变量的原因。感谢您的回复。

你先解释一下你要的到底是什么,因为你的例子看起来很奇怪
如果是我说的情况 1 的话,那不需要任何特别配置

root 目录的意思是
www.1.com/123/abc.file -> /data/123/abc.file
按你的字面意思是
www.1.com/123/abc.file -> /data/123/123/abc.file
我给的 match 不生效的话,reload 了么?以及我是假设路径总是超过两级

是这样的,我现在开放了 /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; } 不生效。
还请指点,谢谢。

因为你这配置就是错的
if is evil
你对 root 的理解有误
root /data/ 就够了
因为根后面接的是 url,也就是说 example.com/123/abc.file -> /data/123/abc.file
这就是自然状态
至于你说不能跳转,问题未必是这个,error log 呢?

因为我有特殊需求,对于用户来说我的路径是隐藏的,所以只是希望用户输入 /123 时候 root 目录自动的对应(因为目录里已经有主页文件了),前端就只是会显示 example.com/123 从而显示出首页。

只写 root /data/的话
example.com/123/ 显示的就是 /data/123/index.html
否则那么多静态站岂不是麻烦死了?

如果 /data 目录下的文件夹的命名是有规律的,可以匹配的到那就直接用正则
比如:
location ~ ^/x(.*) {
root /data;
}

恩,这个我是明白的,只是我的目录里还有一层,就是 /data/未知 /file 要匹配中间那个 x 开头的未知文件夹。谢谢您的回复。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服