这个问题也可能是:“如何使用 RegEx 修改 NGiNX 变量?” ,\nor: “正则表达式反向引用可以有间隙吗?”
\n\n其中任何一个都可以解决我遇到的问题。也许存在一个非常简单的解决方案,在网上挖掘了几个小时后,是时候寻求帮助了。
\n\n这是场景:
\n\n请求 URI 的一部分将始终存在(对于一种花哨的域名 + URI 组合:-)。我强制始终存在 URI 路径组件,该组件紧跟在域名之后,如下所示:
\n\nhttp://somedomain.com/basepart/rest/of/the/path?q=123
\n\n在上面的示例中,“/basepart”表示始终存在的 URI 组件。
\n\n到目前为止,一切都很好。/var/www/somedomain.com/htdocs/当我希望基本文件路径不带basepart,并且使用 php5_fpm 代理时,就会出现问题。我显然设置了:
location /basepart {\n alias /var/www/somedomain.com/htdocs;\n try_files $uri $uri/ /index.php?$args;\n }\nRun 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?
我考虑过命名反向引用,或“收集”或“碎片”反向引用(我认为正则表达式中不存在),以便我可以在分配发生$fastcgi_script_name时捕获基本部分之前和之后的段fastcgi_split_path_info,但还没有\'没让他们工作。Dayo 之前在 SO 中写道: \xc2\xbbNginx 是一个网络服务器,而不是一个脚本应用程序。\xc2\xbb,并建议使用 Lua 来编写更复杂的脚本。但我有一种感觉,我可能忽略了一些非常简单、值得捂脸的解决方案:-]。
有什么想法吗?
\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)