V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
djhuahao
V2EX  ›  NGINX

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

  •  
  •   djhuahao · 2017-05-10 16:46:02 +08:00 · 4510 次点击
    这是一个创建于 2756 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如,当我希望访问 www.1.com/123 则 root 目录变为 /data/123,相应的访问 www.1.com/456 那么 root 目录也会变成 /data/456
    谢谢大家。
    12 条回复    2017-05-12 10:21:46 +08:00
    a282810
        1
    a282810  
       2017-05-10 18:23:22 +08:00
    根据记忆写的,楼主自行测试

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



    location /123/ {
    root /data/;
    }
    ryd994
        2
    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
        3
    djhuahao  
    OP
       2017-05-11 10:05:40 +08:00
    @a282810 不好意思我可能没说清楚,用户 /后面输入的信息是未知的。也就是可能是 /123 /456 又或者其他。
    djhuahao
        4
    djhuahao  
    OP
       2017-05-11 10:06:37 +08:00
    @ryd994 这个我测试这了并不生效,不知道是不是$1 不是全局变量的原因。感谢您的回复。
    ryd994
        5
    ryd994  
       2017-05-11 10:10:49 +08:00
    @djhuahao 你先解释一下你要的到底是什么,因为你的例子看起来很奇怪
    如果是我说的情况 1 的话,那不需要任何特别配置
    ryd994
        6
    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
        7
    djhuahao  
    OP
       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
        8
    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
        9
    djhuahao  
    OP
       2017-05-11 16:17:35 +08:00
    @ryd994 因为我有特殊需求,对于用户来说我的路径是隐藏的,所以只是希望用户输入 /123 时候 root 目录自动的对应(因为目录里已经有主页文件了),前端就只是会显示 example.com/123 从而显示出首页。
    ryd994
        10
    ryd994  
       2017-05-11 16:44:49 +08:00
    @djhuahao 只写 root /data/的话
    example.com/123/ 显示的就是 /data/123/index.html
    否则那么多静态站岂不是麻烦死了?
    a282810
        11
    a282810  
       2017-05-11 18:22:40 +08:00
    如果 /data 目录下的文件夹的命名是有规律的,可以匹配的到那就直接用正则
    比如:
    location ~ ^/x(.*) {
    root /data;
    }
    djhuahao
        12
    djhuahao  
    OP
       2017-05-12 10:21:46 +08:00
    @a282810 恩,这个我是明白的,只是我的目录里还有一层,就是 /data/未知 /file 要匹配中间那个 x 开头的未知文件夹。谢谢您的回复。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3521 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:18 · PVG 19:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.