Ubuntu下API-Platform(Symfony)中CORS_ALLOW_ORIGIN的$符号差异问题
这本质是不同操作系统下shell对.env文件中$符号的解析规则差异,结合你的Ubuntu环境和API-Platform(Symfony)场景,具体原因如下:
Ubuntu下需要双美元符号的原因:
Ubuntu默认用bash/zsh这类POSIX兼容shell,$是变量引用的标识。当你在.env里写单美元符号的正则^https?://(.*)(:[0-9]+)?$时,shell加载.env文件时会把$)识别为变量引用(哪怕这个变量不存在),导致正则表达式被截断或篡改,最终传给Symfony的正则不符合预期。而双美元符号$$在POSIX shell里会被转义成单个$,这样Symfony最终拿到的就是正确的正则^https?://(.*)(:[0-9]+)?$。团队成员单美元符号可行的原因:
他们大概率用的是Windows系统(cmd/PowerShell),这些shell对.env文件里的$解析逻辑不同,不会把$)当成变量处理,所以单美元符号的正则能直接被Symfony正确读取;或者他们的shell配置了特殊的.env加载机制(比如Symfony CLI的加载逻辑会自动处理转义),避免了符号解析问题。替代git stash的更优方案:
不用每次切换分支都执行git stash和git stash apply,可以在项目根目录创建.env.local文件,把你的CORS_ALLOW_ORIGIN配置写在这个文件里:CORS_ALLOW_ORIGIN=^https?://(.*)(:[0-9]+)?$$Symfony会优先加载
.env.local的配置,而且这个文件通常被.gitignore忽略,不会提交到仓库,完美解决团队配置和个人环境的冲突。
内容的提问来源于stack exchange,提问作者Stephane Duteriez

