Nginx 别名和正则表达式

Nginx 别名和正则表达式

我需要一些有关 nginx 文件夹别名的帮助

我有我的文件夹 www/,其中包含我的网站 example.com 的容器以及许多文件夹,例如 client0、client1、client2...我不应该修改 www/example/,但我需要将 example.com/serveur0/ 重定向到 www/client0/

我制定了这样的 nginx 规则:

location /serveur0/ {
    alias /www/client0/;
    index index.php
    location ~ /serveur0/(.*\.php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$1;
        include /etc/nginx/fastcgi_params;
    }
}

并且运行完美。但是当我尝试使用正则表达式将其概括时,我遇到了一些问题。我试过这个

location /serveur([0-9]+)$/ {
    alias /www/client$1/;
    index index.php
    location ~ /serveur$1/(.*\.php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$1;
        include /etc/nginx/fastcgi_params;
    }
}

但它不起作用,我不明白为什么。你能帮助我吗?

答案1

在第一个location区块:

  1. 您忘记指定前缀~(或~*)来使用正则表达式。

  2. $删除尾部斜杠前的美元符号 ( )。

位置 ~ /server([0-9]+)/ {
    别名/www/client$1/;
    索引 index.php
    位置 ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        包括 fastcgi.conf;
        fastcgi_intercept_errors开启;
        错误页面 404 /error/404.php;
    }
}

答案2

以下是配置的修订版本,其中包含一些改进:

location ~* ^/serveur([0-9]+)/(.*)$ {
    alias /www/client$1/$2;
    try_files $uri $uri/ /index.php;

    location ~* \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $request_filename;
        include /etc/nginx/fastcgi_params;
    }
}

以下是我所做的更改:

  • 我修改了 location 指令中的正则表达式,使其使用 ~* 修饰符,这样匹配就不区分大小写。这样您就可以以相同的方式处理 /serveurX/ 和 /serveurx/ 的请求。
  • 我添加了 try_files 指令来处理与目录中的文件不匹配的请求。在这种情况下,它将返回到 /index.php 文件。
  • 我改变了 fastcgi_param 指令,将 SCRIPT_FILENAME 环境变量设置为 $request_filename,这是请求文件的绝对文件路径。
  • 我使用 ~* 修饰符将嵌套位置块中的正则表达式更改为匹配 .php 文件,这使得匹配不区分大小写。

此配置应按预期工作,处理 /serveurX/ URL 的请求,将 PHP 文件的请求传递给 FastCGI 服务器进行处理,并在未找到请求的文件时提供默认的 index.php 文件。

相关内容