如何从 NGiNX fastcgi_script_name 中删除路径段?

Vil*_*lle 2 php regex nginx

这个问题也可能是:“如何使用 RegEx 修改 NGiNX 变量?” ,\nor: “正则表达式反向引用可以有间隙吗?”

\n\n

其中任何一个都可以解决我遇到的问题。也许存在一个非常简单的解决方案,在网上挖掘了几个小时后,是时候寻求帮助了。

\n\n

这是场景:

\n\n

请求 URI 的一部分将始终存在(对于一种花哨的域名 + URI 组合:-)。我强制始终存在 URI 路径组件,该组件紧跟在域名之后,如下所示:

\n\n

http://somedomain.com/basepart/rest/of/the/path?q=123

\n\n

在上面的示例中,“/basepart”表示始终存在的 URI 组件。

\n\n

到目前为止,一切都很好。/var/www/somedomain.com/htdocs/当我希望基本文件路径不带basepart,并且使用 php5_fpm 代理时,就会出现问题。我显然设置了:

\n\n
    location /basepart {\n            alias /var/www/somedomain.com/htdocs;\n            try_files $uri $uri/ /index.php?$args;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

但由于动态文件位于 PHP 中,我需要使用fastcgi_split_path_info$request_uri构建/传递SCRIPT_FILENAME给 php5_fpm。我怎么做?如何删除/basepartfrom$fastcgi_script_name或 from $request_uri,否则 PHP 将在 中查找文件/var/www/somedomain.com/htdocs/basepart

\n\n

我考虑过命名反向引用,或“收集”或“碎片”反向引用(我认为正则表达式中不存在),以便我可以在分配发生$fastcgi_script_name时捕获基本部分之前和之后的段fastcgi_split_path_info,但还没有\'没让他们工作。Dayo 之前在 SO 中写道: \xc2\xbbNginx 是一个网络服务器,而不是一个脚本应用程序。\xc2\xbb,并建议使用 Lua 来编写更复杂的脚本。但我有一种感觉,我可能忽略了一些非常简单、值得捂脸的解决方案:-]。

\n\n

有什么想法吗?

\n

小智 5

如果其他人偶然发现这个问题,经过一番集思广益,我想出了一个愚蠢而明显的解决方案:

    root /app/frontend/web/;
    location /api/ {
        alias /app/backend/web/;
        index index.php index.html;
        # Double /api/ because "that's how nginx alias and try_files works together"
        try_files $uri /api//api/index.php$is_args$args;

        location ~ ^/api(/.*\.php(?:\?.*)?)$ {
            try_files $uri /api//api/index.php$is_args$args;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

即使用正则表达式捕获组。

根据此规则,请求将按以下方式路由:

  /index.html -> /app/frontend/web/index.html
  /test/test.php -> /app/frontend/web/test/test.php as plaintext
  /api/<somepath> -> /app/backend/web/<somepath> (proxied to FPM if .php) if it exists, otherwise /app/backend/web/index.php
Run Code Online (Sandbox Code Playgroud)