当前位置: 首页 > 知识库问答 >
问题:

php - nginx匹配path_info为空?

寿高阳
2023-12-07
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结果是path_info为空,其中第一个正则小括号匹配结果是:/4.php/xyz/5.php ,我不理解既然第一个小括号有结果,第2个小括号为什么不直接取后面的内容?

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

共有1个答案

苗阳
2023-12-07

在 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 或者其他特殊字符时。在这种情况下,你可能需要进一步修改你的正则表达式来适应这些特殊情况。

 类似资料:
  • 问题内容: 所有外部URL都类似于“模块/操作?key1 = param1”。无法进行自定义- 但速度很快。区别在于,第一个使用PHP的GET,第二个使用PATH_INFO。 我已经看过好几次了,但仍然不知道它到底是什么。它有什么作用? 问题答案: 实际上,它与服务PHP页面的Apache Web服务器有关,而与PHP本身无关。 是在启用指令后由Apache设置的环境变量。它将包含尾随路径名信息,

  • 两个问题~ 问题1 nginx.conf 怎么写才能让 localhost:8001 下的任意路径都进入到index.html? localhost:8001/ localhost:8001/a localhost:8001/a/b 问题2 以下是 Nginx 下的文件结构 需要访问 localhost:8001/home, 进入到 /example/pages/home.html, 应该怎么配置

  • 本文向大家介绍详解Nginx location 匹配规则,包括了详解Nginx location 匹配规则的使用技巧和注意事项,需要的朋友参考一下 语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 l

  • 本文向大家介绍nginx下支持PATH_INFO的方法实例详解,包括了nginx下支持PATH_INFO的方法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了nginx下支持PATH_INFO的方法。分享给大家供大家参考,具体如下: 要想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo? pathinfo不是nginx的功能,pat

  • 问题内容: 我正在CodeIgniter中构建一个PHP应用程序。CodeIgniter将所有请求发送到主控制器:。但是,我不喜欢在URI中看到。例如,将路由到。我需要一种可靠的方法来让脚本知道其地址,因此它将知道如何处理导航。根据CodeIgniter文档,我已经使用过。 规则如下: 通常,我只是检查一下,但在这种情况下,它始终为。我可以从,等获得它,但是我正在尝试确定哪一个最可靠。没有人知道(

  • 本文向大家介绍简介Nginx中的location匹配规则,包括了简介Nginx中的location匹配规则的使用技巧和注意事项,需要的朋友参考一下 location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =      #进行