无法将PHP54迁移至PHP81:App Engine部署异常求助
PHP5.4项目迁移至PHP8.1时的路由匹配问题
原PHP5.x环境正常情况
使用PHP5.4(配置指定php55运行时)时,根路径index.php和contact.php均可正常加载,对应的app.yaml配置如下:
runtime: php55 api_version: 1 threadsafe: true automatic_scaling: max_instances: 1 handlers: - url: / script: public/index.php secure: always - url: /(.+\.php)$ script: public/\1
PHP8.1环境异常情况
迁移至PHP8.1运行时后,根路径index.php可正常加载,但访问contact.php时却返回了index.php的内容,对应的app.yaml配置如下:
runtime: php81 instance_class: F2 handlers: - url: / script: public/index.php secure: always - url: /(.+\.php)$ script: public/\1
问题原因与修复方案
核心原因
GAE的PHP8.x环境对路由正则捕获组的引用规则、路由匹配优先级的处理逻辑与PHP5.x存在差异:
- YAML中
\1会被解析为转义字符,无法正确引用正则捕获的分组内容; - 路由匹配按配置顺序执行,若根路径规则先匹配,会拦截所有未被更精确规则匹配的请求(实际是正则匹配未生效导致
.php请求落入根路径规则)。
修复后的app.yaml配置
runtime: php81 instance_class: F2 handlers: # 优先匹配所有.php结尾的请求,确保这类请求被正确转发到对应文件 - url: /(.+\.php)$ script: public/$1 secure: always # 仅匹配根路径/,转发到index.php - url: / script: public/index.php secure: always
关键调整点
- 调整路由顺序:将PHP文件的匹配规则放在根路径规则之前,确保
.php结尾的请求优先被匹配; - 修正捕获组引用:将
\1改为$1,避免YAML转义问题,同时符合PHP8.x环境的路由变量引用规范。
内容的提问来源于stack exchange,提问作者Shailesh Bhimani
相关产品推荐
相关产品推荐

