使用Caddy handle_path时,PHP的SCRIPT_NAME缺失完整路径如何解决?
解决Caddy handle_path下PHP $_SERVER['SCRIPT_NAME']缺失前缀的问题
问题根源是handle_path会自动剥离匹配的路径前缀(这里是/subpath/),导致传递给PHP-FPM的SCRIPT_NAME默认只保留剥离后的部分,因此需要手动补上前缀。
修改方案一:使用extra_env配置FastCGI变量
直接在php_fastcgi块中添加extra_env参数,将前缀拼接到SCRIPT_NAME前:
:80 { handle_path /subpath/* { php_fastcgi localhost:9000 { root /var/www/html extra_env SCRIPT_NAME="/subpath{fastcgi.SCRIPT_NAME}" extra_env PATH_INFO="/subpath{fastcgi.PATH_INFO}" } } }
extra_env是Caddy专门用于传递额外FastCGI环境变量的指令,能精准覆盖默认的SCRIPT_NAME值,确保PHP拿到包含完整前缀的路径。
修改方案二:替换handle_path为handle+rewrite
如果不想手动拼接变量,也可以放弃handle_path,改用handle配合rewrite保留完整路径:
:80 { handle /subpath/* { rewrite * /subpath{path} php_fastcgi localhost:9000 { root /var/www/html } } }
这种方式通过rewrite确保路径前缀不被剥离,PHP-FPM会自动拿到完整的SCRIPT_NAME。
两种方案都能实现需求,推荐第一种方案,因为它保留了handle_path的简洁性,仅针对性修复变量问题。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

