Symfony6+API Platform3部署IIS10:接口返回日志而非结果
解决Symfony 6 + API Platform 3部署IIS 10返回日志而非JSON的问题
1. 强制切换到生产环境并关闭调试模式
线上环境必须禁用调试模式,否则Symfony会将日志直接输出到响应流中:
- 修改
public/index.php中的环境变量配置:// 确保这两行设置为生产环境参数 $_SERVER['APP_ENV'] = 'prod'; $_SERVER['APP_DEBUG'] = '0'; - 更推荐的方式是通过IIS配置环境变量:
进入站点的「配置编辑器」,定位到system.webServer/fastCgi/application,添加或更新两个环境变量:APP_ENV = prodAPP_DEBUG = 0
2. 修正日志输出配置
生产环境下要避免日志输出到响应流,调整config/packages/prod/monolog.yaml:
monolog: handlers: main: type: rotating_file path: "%kernel.logs_dir%/%kernel.environment%.log" level: error channels: ["!event"]
确保没有配置stream: php://stdout这类会直接输出到HTTP响应的日志处理器。
3. 优化IIS的web.config规则
当前rewrite规则可能存在路径拼接问题,替换为适配Symfony的标准规则:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <defaultDocument> <files> <add value="index.php" /> </files> </defaultDocument> <rewrite> <rules> <rule name="Symfony Route Rewrite" stopProcessing="true"> <match url="^(.*)$" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php" appendQueryString="true" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
说明:移除了对
index.php的排除规则,直接将所有非文件/目录请求转发到index.php,避免路径传递错误。
4. 生成生产环境缓存
在服务器上执行以下命令(无命令行权限可本地生成后上传var/cache/prod目录):
# 清除旧缓存 php bin/console cache:clear --env=prod # 优化自动加载 composer dump-autoload --optimize --classmap-authoritative
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

