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 / 问题 / 1153616
Accepted
bolino
bolino
Asked: 2024-02-15 14:42:25 +0800 CST2024-02-15 14:42:25 +0800 CST 2024-02-15 14:42:25 +0800 CST

省略 nginx 配置中子文件夹的重复作为同一域上的网站

  • 772

我有一个 Debian Web 服务器,其主要/var/www/mymainwebsite服务在 URL 上http(s)://mydomain.com,并且许多独立的 Web 项目也在/var/www( /var/www/mywebsite1、/var/www/website2等) 中,必须在 URL http(s)://mydomain.com/mywebsite1、http(s)://mydomain.com/mywebsite2等上提供服务。

因此,mydomain.com 的 vhost 上的服务器指令包含许多针对子网站的指令,其中的指令location几乎相同(因为nginx 文档表示,当 location 与别名指令值的最后部分匹配时,最好使用 root 指令而不是别名指令)。其中一些包含一些 PHP 和重写规则,但大多数不包含。root

看起来像这样:

server {

    server_name mydomain.com;
    listen 443 quic;
    listen 443 ssl;

    root /var/www/mymainwebsite;

    index index.html index.htm index.php;

    try_files $uri $uri/ =404;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    location /mywebsite1 {
        root /var/www/;
    }

    location /mywebsite2 {
        root /var/www/;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
        rewrite ^/mywebsite2/(.*)\.html$        /mywebsite2/index.php?hash=$1 last;
    }

    location /mywebsite3 {
        root /var/www/;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
        rewrite ^/mywebsite3/(.*)\.html$        /mywebsite3/index.php?id=$1 last;
    }

    location /mywebsite4 {
        root /var/www/;
    }

    ...

    location /mywebsite19 {
        root /var/www/;
    }

    error_log /var/www/mydomain.log warn;
}

由于大多数指令都是相似的,有什么方法可以优化和/或避免在此虚拟主机中重复?

nginx
  • 3 3 个回答
  • 134 Views

3 个回答

  • Voted
  1. HBruijn
    2024-02-15T15:30:37+08:002024-02-15T15:30:37+08:00

    避免无休止地重复相同指令的典型方法是将它们存储在单独的文件中,并使用指令include在需要时加载它们,例如您已经使用的指令include snippets/fastcgi-php.conf;

    此外location ,还接受正则表达式来匹配多个精确字符串,指令 也是如此rewrite,当每个或多个 /website1-99 位置遵循相同的模式时,可以将其放入单个部分中。

    另一方面,为了简单而不是让事情过于复杂,有很多话要说。我宁愿有 20 个部分,而不是三个不立即明显的正则表达式来匹配需要一个配置的站点 1,9,13,第二个正则表达式用于需要有一个配置的站点 2,3,4,10,11,15,19放在另一个上,其余的需要放在第三个上。

    • 1
  2. Esa Jokinen
    2024-02-17T19:18:45+08:002024-02-17T19:18:45+08:00

    看来您正在尝试使用 Nginx 的配置来解决由您自己的目录结构引起的问题。

    • 如果主站点直接位于 上/var/www,则无需更改root子目录中所有站点的指令,因为所有站点的指令都已相同。

    • 如果您坚持拥有/var/www/main,您可以将根目录和单独的根目录重定向到该站点。

      server {
          root /var/www;
      
          location = / {
              return 301 https://example.com/main/
          }
      }
      
    • 1
  3. Best Answer
    bolino
    2024-02-19T10:50:58+08:002024-02-19T10:50:58+08:00

    经过更多研究,我发现多个 URL 可以使用独特的正则表达式位置指令,如下所示。

    另外,感谢Esa Jokinen的回答,我们可以使用根目录作为 root 指令,并将主网站目录放在 location / 指令中。

    总而言之,以下内容看起来更加简短和可读,同时仍然在同一个文件中,避免了更多include:

    server {
    
        server_name mydomain.com;
        listen 443 quic;
        listen 443 ssl;
    
        root /var/www;
    
        index index.html index.htm index.php;
    
        try_files $uri $uri/ =404;
    
        location ~ ^/(mywebsite1|mywebsite2|...|mywebsite19) {
        }
    
        location ~ ^/(mywebsite3|mywebsite4|...) {
            location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.2-fpm.sock;
            }
           rewrite ^/(.*)\.html$        /index.php?hash=$1 last;
        }
    
        location / {
            root /home/www/mymainwebsite;
            location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php8.2-fpm.sock;
            }
        }
    
        error_log /var/www/mydomain.log warn;
    }
    
    • 0

相关问题

  • 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