如何使用 NGINX 重写 URL 以隐藏经常更改的多个子文件夹中的 index.php?

如何使用 NGINX 重写 URL 以隐藏经常更改的多个子文件夹中的 index.php?

因此,我们有一个 PHP 开发服务器,其中每个开发人员都有一个个人子域名,例如https://dev-abc.mysite.com与相应的 NGINX 配置。

开发人员将我们的仓库的一个分支检入如下文件夹中:

  • /var/www/html/dev-abc/branch-X
  • /var/www/html/dev-abc/branch-Y
  • /var/www/html/dev-abc/branch-Z

URL 格式:
https://dev-abc.mysite.com/{BRANCH}/index.php/{MODULE}/{CLASS}/?event={EVENT}&otherParamX=Y

{MODULE} 是模块/中的文件夹
{CLASS} 是模块/{MODULE} 中的类文件
{EVENT} 是模块/{MODULE} 中类内的方法

分支的访问方式如下: https://dev-abc.mysite.com/branch-X/index.php/report/invoice

我们只是尝试将 URL 重写为:
https://dev-abc.mysite.com/branch-X/report/invoice/

对于其子域下的所有子目录。

NGINX 配置如下:

小路:
/etc/nginx/conf.d/dev-abc.conf

server {
        server_tokens off;

        listen 80;
        autoindex off;
        server_name dev-abc.mysite.com;
        root /var/www/html/dev-a;

        error_log /home/dev-abc/nginx-error.log notice;

        include /etc/nginx/includes/dev_sandbox;

        rewrite_log on;
}

注意:/etc/nginx/includes/dev_sandbox 包含很多有关标头和 CORS 的内容,因此除非需要,否则我不会发布它,因为它很长。

我尝试了以下方法:

尝试 1:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

NGINX 抛出:^(.+.php)(/.+)" 与 "/index.php" 不匹配,浏览器中也出现“文件未找到”

尝试2:

location ~(.+)/(.+) {
    try_files $uri $1/index.php/$2;
}

作品:
https://dev-abc.mysite.com/branch-X/report/

不起作用:
https://dev-abc.mysite.com/branch-X/report/invoice/

尝试3:

location ~(.+)/(.+)/(.+) {
    try_files $uri $1/control.php/$2/$3;
}

作品:
https://dev-abc.mysite.com/branch-X/report/invoice/

不起作用:
https://dev-abc.mysite.com/branch-X/report/

抛出:
未找到“/var/www/html/dev-abc/branch-X/report/index.php”

答案1

重复运算符如*+贪婪的。因此,第一次捕获(.+)/(.+)将占用所有空间,直到最后的 /(后面至少有一个字符)。因此你的第二次尝试是完全可以预料到的。

您可以改用惰性重复运算符,如*?+?,例如:

location ~ (.+?)/(.+) { ... }

或者,您可以使用仅匹配不为 的字符的字符类/(记住第一个字符始终是/),例如:

location ~ (/[^/]+)/(.+) { ... }

虽然在这种情况下不是绝对必要的,但你或许应该添加锚点因为您只对匹配整个 URI 感兴趣,所以围绕表达式,例如:

location ~ ^(.+?)/(.+)$ { ... }

或者:

location ~ ^(/[^/]+)/(.+)$ { ... }

重要的提示

正则表达式位置块按顺序进行评估,直到找到匹配项。请确保您的location ^(.+.php)(/.+)块按顺序首先出现,以避免重定向循环。

答案2

相关内容