AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1039781
Accepted
tftd
tftd
Asked: 2020-10-23 16:20:06 +0800 CST2020-10-23 16:20:06 +0800 CST 2020-10-23 16:20:06 +0800 CST

nginx中是否有包含域名的变量?

  • 772

我正在对 nginx/1.14.1 服务器进行配置重构,该服务器充当 PHP-FPM 的反向代理。

现在的配置方式,我可以做到

# in a server {} section at a vhost there's
# set $base_domain domain.com;
# and then it includes another config file which has something like this: 
if ($php_logs_path = '') {
    set $php_logs_path /a/b/$base_domain/logs/$server_name.php_www_errors.log;
}
fastcgi_parma PHP_ADMIN_VALUE "error_log=$php_logs_path"

这工作正常,日志文件出现在正确的路径:

/a/b/domain.com/logs/some-sub-domain.domain.com.php_www_errors.log

但是,我并不特别喜欢我现在需要超过一百个虚拟主机来设置$base_domain变量的事实。我浏览了nginx 文档,但我找不到只给出domain没有子域的段的变量。

有没有一种简单的方法可以使用自定义变量来做到这一点?

nginx
  • 2 2 个回答
  • 577 Views

2 个回答

  • Voted
  1. Best Answer
    Ivan Shatsky
    2020-10-24T04:22:59+08:002020-10-24T04:22:59+08:00

    map使用一些全局指令怎么样?

    map $server_name $base_domain {
        ~([^.]*)\.([^.]*)$    $1.$2;
    }
    

    map块是在http上下文中定义的,因此您可以在全局 nginx 配置中将其与虚拟主机分开定义。

    更新

    正如 OP 所指出的,此解决方案不适用于.co.uk域。我想到了写这个答案的其他例子——例如,Australian .com.au, .net.au, Ukrainian.com.ua等等.in.ua。好吧,由于国家 TLD 总是两个字母,我们可以假设 any.xx.xx和.xxx.xxdomain 后缀很可能是一些国家的两个组成部分的 TLD。由于map块表达式列表是从头到尾检查的,因此可以使用以下map块捕获这些域:

    map $server_name $base_domain {
        "~([^.]*)\.([a-z]{2,3})\.([a-z]{2})$"    $1.$2.$3;
        ~([^.]*)\.([^.]*)$                       $1.$2;
    }
    

    更新 2

    刚刚发现,这些正则表达式中不需要多个捕获组:

    map $server_name $base_domain {
        "~([^.]*\.[a-z]{2,3}\.[a-z]{2})$"    $1;
        ~([^.]*\.[^.]*)$                     $1;
    }
    
    • 2
  2. Michael Hampton
    2020-10-23T16:26:09+08:002020-10-23T16:26:09+08:00

    你为什么不重复使用$server_name?此变量设置为块中定义的第一个 。只需确保第一个定义的名称是您想要的名称(并且可能已经是)。server_nameserver

    • 1

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve