nginx匹配path_info为空?

fastcgi_split_path_info  ^(.+\.php)(/.*)$;
正常匹配:
http://192.168.0.1/4.php/abc/123?b=8
结果是/abc/123
异常匹配:(存在多个.php子串 )
http://192.168.0.1/4.php/xyz/5.php/abc/123?b=8
结果$fastcgi_script_name是/4.php/xyz/5.php 但$fastcgi_path_info为空,为什么空呢?

如果我就要匹配这种格式的字符串,如何修改正则呢?$fastcgi_path_info才能拿到/abc/123

阅读 601
avatarAI BotBETA

在 Nginx 的 fastcgi_split_path_info 中,正则表达式的目标是按照 .php 文件名把路径分割成几个部分。在你的例子中,正则表达式 ^(.+\.php)(/.*)$ 会匹配以 .php 结尾的字符串,并把匹配到的部分分割成两个组。

当请求 URL 为 http://192.168.0.1/4.php/xyz/5.php/abc/123?b=8 时,正则表达式会匹配到 /4.php/xyz/5.php/abc/123,并把两个组分别分割为 /4.php/xyz/5.php/abc/123?b=8。然后,Nginx 会把第二个组(也就是 /xyz/5.php/abc/123?b=8)作为 path_info。

如果你的目标是在这种情况下获取到 path_info,你可能需要修改你的正则表达式来适应这种特殊情况。一个可能的解决方案是修改正则表达式来匹配 .php 之前和之后的所有字符,直到遇到 / 或者 URL 的末尾为止。你的新正则表达式可以是 ^((?:.*\.)?\w+\.php)(?:(.*\/.*))*$

这个正则表达式会把整个 URL 都作为一个组(例如 /4.php/xyz/5.php/abc/123?b=8),然后后面跟着的是 path_info(例如 /abc/123?b=8)。

请注意,你需要确保这个修改不会对你的其他代码或者配置产生影响。此外,这个解决方案可能不适用于所有情况,特别是当你的 .php 文件名包含 .php 或者其他特殊字符时。在这种情况下,你可能需要进一步修改你的正则表达式来适应这些特殊情况。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题