gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:25:58 24 4
gpt4 key购买 nike

这个问题也可以是:“How to modify an NGiNX variable with a RegEx?”,或者:“RegEx 反向引用可以有间隙吗?”

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

场景如下:

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

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

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

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

    location /basepart {
alias /var/www/somedomain.com/htdocs;
try_files $uri $uri/ /index.php?$args;
}

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

我考虑过命名反向引用,或“收集”或“碎片化”反向引用(我认为正则表达式中不存在),以便我可以捕获 $fastcgi_script_name 前后的段fastcgi_split_path_info 分配发生时的 basepart,但还没有让它们工作。 大友 writes earlier at SO :»Nginx 是一个网络服务器,而不是一个脚本应用程序。»,并建议使用 Lua 来编写更复杂的脚本。但我有一种感觉,我可能会忽略一些非常简单、值得面对面的解决方案:-]。

任何想法,任何人?

最佳答案

如果其他人偶然发现了这个问题,经过一番头脑 Storm 后我想出了一个非常明显的解决方案:

    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;
...
}
}

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

使用此规则,请求将按以下方式路由:

  /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

关于php - 如何从 NGiNX fastcgi_script_name 中删除路径段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34523295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com