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

Laravel中如何为/public目录下所有图片发送Cache-Control响应头?

解决Laravel Sail中图片Cache-Control响应头不生效的问题

核心原因:Sail默认用Nginx,.htaccess是Apache配置文件

Laravel Sail默认部署的是Nginx容器,而你写的.htaccess是Apache专属的配置文件,Nginx完全不识别,这是配置失效的最常见原因。下面给两种针对性解决方案:

方案1:切换Sail到Apache容器

  1. 修改项目根目录的docker-compose.yml,把web服务的镜像换成Apache版本:
services:
    laravel.test:
        image: 'laravel.test:apache'
        # 其他原有配置保持不变
  1. 重启Sail容器:
./vendor/bin/sail down
./vendor/bin/sail up -d
  1. 启用Apache的mod_expires和mod_headers模块:
./vendor/bin/sail exec laravel.test a2enmod expires headers
./vendor/bin/sail exec laravel.test service apache2 restart
  1. 确认.htaccess放在public目录下,同时检查Apache的AllowOverride配置:
    进入容器修改/etc/apache2/sites-available/000-default.conf,在<Directory /var/www/html/public>块里加上:
AllowOverride All

改完再重启Apache服务。

方案2:保留Nginx,直接配置Nginx缓存规则

不想换Apache的话,直接给Nginx加缓存配置:

  1. 在项目根目录创建docker/nginx/conf.d/custom.conf文件,写入:
location ~* \.(png|gif|ico|jpeg|jpe|jpg|svg|css|js)$ {
    expires 1y;
    add_header Cache-Control "max-age=31536000, public";
}
  1. 修改docker-compose.yml,把自定义配置挂载到Nginx容器:
services:
    laravel.test:
        # 其他原有配置不变
        volumes:
            - '.:/var/www/html'
            - './docker/nginx/conf.d/custom.conf:/etc/nginx/conf.d/custom.conf'
  1. 重启Sail生效:
./vendor/bin/sail down
./vendor/bin/sail up -d

验证方法

  • 清空浏览器缓存,用隐私模式打开图片,查看响应头是否有Cache-Control
  • 用curl命令直接测试:
curl -I http://你的项目域名/test.png

看输出里是否包含Cache-Control: max-age=31536000, public

内容的提问来源于stack exchange,提问作者Muaath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:02:50