You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:43:12