Symfony 7 AssetMapper:开发环境资源正常,生产环境404报错
解决AssetMapper生产环境资源404问题
核心原因
开发环境中Symfony内置服务器通过框架内核处理/assets/*请求,无需public/assets目录存在实体文件;但生产环境下,Apache需要直接访问编译后的静态资源,或通过正确的重写规则判断是否转发请求。
排查修复步骤
1. 核对资源路径与权限
- 确认编译后的资源实际存放在
public/assets/目录下,浏览器请求的/assets/images/logo-xxx.png对应服务器路径应为[你的项目根目录]/public/assets/images/logo-xxx.png - 确保
public/assets目录权限为755,文件权限为644,且所属用户与Apache运行用户一致(通常为www-data)
2. 修正Apache重写规则
确保虚拟主机配置中优先匹配存在的静态文件,再转发到index.php,避免静态资源被误拦截:
<VirtualHost *:80> ServerName your-domain.com DocumentRoot /var/www/your-project/public <Directory /var/www/your-project/public> AllowOverride All Require all granted RewriteEngine On # 关键规则:如果请求的文件/目录存在,直接返回 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L] </Directory> </VirtualHost>
若之前的规则缺少RewriteCond %{REQUEST_FILENAME} !-f,会导致已存在的静态资源被转发到Symfony内核,返回404。
3. 验证AssetMapper配置
检查config/packages/asset_mapper.yaml,确保编译路径与版本策略正确:
asset_mapper: paths: - assets/ compiled_path: public/assets version_strategy: 'asset_mapper.version_strategy.content_hash'
执行php bin/console asset-map:list,确认输出的资源编译路径与服务器上的实际文件路径一致。
4. 清除缓存并重新编译
生产环境下执行以下命令,避免缓存导致的路径映射错误:
php bin/console cache:clear --env=prod php bin/console asset-map:compile --env=prod
5. 启用Apache mod_rewrite模块
确保重写模块已启用并重启服务:
sudo a2enmod rewrite sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

