XAMPP子目录下访问Stripe Checkout API失效,报找不到shared.php错误
问题根因分析
- 你看到日志里的双反斜杠不是错误来源,这是Windows系统日志对路径分隔符的转义显示,实际系统解析的是正常单反斜杠路径,和.htaccess规则、页面base href设置没有直接关联。
- 核心矛盾是两个运行环境的PHP文档根完全不同,导致代码里的相对路径解析逻辑彻底错位:
- 独立运行Stripe示例时,你在
/stripe_test目录下执行php -S localhost:4242,内置服务器的文档根就是/stripe_test文件夹本身。所有PHP文件里的相对路径引入都以这个目录为基准,config.php里的require_once 'shared.php'可以直接匹配同目录下的关联文件,前端请求接口的路径也和目录结构完全对齐,因此功能全程正常。 - 嵌套接入现有站点时,XAMPP/Apache的文档根是整个站点的Root目录,你的Stripe相关代码都嵌在
/stripe_test子文件夹下。此时报错日志显示触发的是站点根路径下C:\xampp\root\config.php的加载逻辑,说明前端发起创建Checkout Session的请求路径出现了层级偏移,没有正确命中/stripe_test目录下的接口文件,反而跑到了站点根路径下执行代码,自然会因为路径不对找不到关联文件。
- 独立运行Stripe示例时,你在
- 你的.htaccess配置不存在规则错误:规则第一块就配置了「如果请求的文件/文件夹真实存在,直接放行不做重写」,只要接口文件的请求路径正确,不会被重写规则篡改路由。
排查与修复方案
- 修正前端接口请求路径
原Stripe示例为了适配独立运行的环境,前端请求接口的路径一般是根相对路径(比如fetch('/createcheckout.php'))。这种路径在独立运行时会匹配到/stripe_test/createcheckout.php,但在嵌套子目录的站点下会直接指向站点根目录的同名文件,根本不会进入/stripe_test文件夹,这就是路径错位的直接原因。
调整二选一即可生效:- 把请求路径改成带完整层级的绝对路径:
fetch('/stripe_test/createcheckout.php') - 改成不带开头斜杠的相对路径:
fetch('createcheckout.php'),匹配当前页面所在的/stripe_test目录下的接口文件
- 把请求路径改成带完整层级的绝对路径:
- 修正PHP文件的引入逻辑
把所有PHP文件里的裸相对路径引入,改成基于当前文件物理位置的定位方式,避免外部请求路径变化导致的文件找不到问题。比如把require_once 'shared.php'改成:
这种写法会以当前执行的PHP文件所在的物理目录为基准定位关联文件,不管外部请求从哪个路径加载文件,只要关联文件和当前文件在同一目录下,就可以正常加载,不会再因为工作目录变化出现路径错位。require_once __DIR__ . '/shared.php'; - 同步调整webhook转发配置
原来执行的stripe listen --forward-to=localhost:4242是为了对接内置服务器写的,现在所有请求都跑在XAMPP的8080端口上,需要把转发目标改成实际的webhook接口地址,不然Stripe的事件通知还是会被推到已经停止的4242端口服务上,无法触发后续逻辑。调整后的执行命令为:stripe listen --forward-to=localhost:8080/stripe_test/webhook.php - 兼容Session读取逻辑
所有Stripe相关的PHP文件开头加上session_start(),并确保和现有站点的Session配置(cookie作用域、存储路径)保持一致,即可正常读取登录态的$_SESSION变量,不需要额外调整现有目录结构。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

