【问题标题】:nginx dynamic change root of subdomain to folder on same levelnginx动态将子域的根更改为同级文件夹
【发布时间】:2020-08-14 22:02:40
【问题描述】:

我的服务器上有这个层次结构:

/var/www/domain.tld/web
                   /sub

/etc/nginx/sites-available/domain.tld中的根是这样设置的:

server {

  root /var/www/domain.tld/web;
  index index.html index.php index.htm; 
  ...
    location / {
    try_files $uri $uri/ =404;
}

如何使 nginx 动态转发到特定文件夹,所以如果我在 /sub 中创建文件夹,例如 /var/www/domain.tld/sub/subdomain 所以如果我提出请求http://subdomain.domain.tld 它会转发到文件夹子中的这个文件夹? 所以再次something.domain.tld 将去/var/www/domain.tld/sub/something域。 tld 将转到 /var/www/domain.tld/web

谢谢!

【问题讨论】:

    标签: linux nginx


    【解决方案1】:

    首先,欢迎来到 StackOverflow! :)

    可能有几种方法可以实现这一点,但我会尝试一个简单的map$host 中设置一个$my_subdir 变量,然后您可以在root 中使用它。 $host 变量是根据传入请求自动设置的。

    在本例中,我们使用正则表达式来检查$host 是否匹配subdomain.domain.tld。如果是这样,捕获子域部分 - 括号中的位 - 并使用它来生成值“sub/subdomain”($1 表示使用从正则表达式中捕获的第一件事)。如果不匹配,则默认为“web”。

    这样,

    • 当请求以http://domain.tld/foo.html 之类的形式出现时,所提供的响应为/var/www/domain.tld/web/foo.html
    • 如果请求以http://bar.domain.tld/foo.html 之类的形式出现,则提供的响应为/var/www/domain.tld/sub/bar/foo.html
    map $host $my_subdir {
      ~^(?:www\.)?((?!www\.)[^.]+)\.domain\.tld$  sub/$1;
      default                                     web;
    }
    
    server {
    
      root /var/www/domain.tld/$my_subdir;
      index index.html index.php index.htm; 
      ...
        location / {
        try_files $uri $uri/ =404;
    }
    

    【讨论】:

    • 您好,谢谢您的回复。还有一件事我无法弄清楚。您的解决方案有效,但我忘了提一件事。当我请求像 www.sub.domain.tld 或 www.domain.tld 这样的 URL 时,我不希望它们进入 /sub/www 文件夹。再次感谢!
    • 没问题 - 请参阅编辑后的答案。正则表达式现在稍微复杂一点,但本质上它表示识别但忽略任何 www. 前缀,并捕获子域部分,确保您不将 www. 单独视为子域。所以现在 domain.tldwww.domain.tld 都应该映射到 /websubdom.domain.tldwww.subdom.domain.tld 应该映射到 /sub/subdom
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2018-02-07
    • 2021-05-29
    • 2017-05-30
    • 2013-06-24
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多