Php 在Laravel中使用HTTP缓存,静态文件路径生成
我计划在下一个项目中使用Laravel框架。 到现在为止,我一直在组织项目中静态内容的链接(图像、脚本等) 例如,我有这个缓存选项(do cache all static files,nginx): 如何创建指向main.js文件的链接?如果文件被修改,如何告知代理文件已过期 在我目前的项目中,我有一个版本控制系统,它使用文件修改时间为文件生成唯一的前缀。所以链接会像下一次文件更改时,链接会自动更改Php 在Laravel中使用HTTP缓存,静态文件路径生成,php,laravel,browser-cache,http-caching,Php,Laravel,Browser Cache,Http Caching,我计划在下一个项目中使用Laravel框架。 到现在为止,我一直在组织项目中静态内容的链接(图像、脚本等) 例如,我有这个缓存选项(do cache all static files,nginx): 如何创建指向main.js文件的链接?如果文件被修改,如何告知代理文件已过期 在我目前的项目中,我有一个版本控制系统,它使用文件修改时间为文件生成唯一的前缀。所以链接会像下一次文件更改时,链接会自动更改 在Laravel中实现此功能的最佳实践是什么?谢谢 我会将其作为一个查询字符串来执行,它很简单,
在Laravel中实现此功能的最佳实践是什么?谢谢 我会将其作为一个查询字符串来执行,它很简单,足够准确,并且不需要任何复杂的层来实现。只需将文件的最后修改作为查询字符串放在链接上即可。这将强制浏览器刷新文件
<link rel="stylesheet" type="text/css" href="/css/style.min.css?v=<?= File::modified(path('public').'/css/style.min.css') ?>" />
我们还在CloudFront上定义了10个子域,因此浏览器不会达到同一个域6-8个并发请求的限制:
cdn0.example.com
cdn1.example.com
cdn2.example.com
... and so on
我们数据库中的每个条目都使用一个通过计算resource.id%10
选择的独占子域,这非常快,并且总是为每个实体返回相同的子域(帮助客户端和CloudFront缓存)。这是你能得到的最好的图像服务
UI图像存储在独占的子域assets.example.com
,这些图像到目前为止还没有版本化,因为我们不会对设计做太多更改,如果我们这样做,我们可能会将新的资产放在类似/v2/
或/newhemename/
文件夹中。这种方法对回滚甚至用户选择的主题都有很大帮助
CSS和JS由Apache从Laravel
/public
目录中提供。这不是最快的方法,但由于我们现在专注于开发,所以自动编译更少的代码和闭包就更重要了。当我们为最终用户启动时,我们可能会想到一个自动部署系统,它编译资产,使用时间戳前缀在S3/CloudFront上发布资产,并缓存它们的最后一个时间戳以进行视图渲染。我会将其作为一个查询字符串来执行,它非常简单、准确,并且不需要任何复杂的层来实现。只需将文件的最后修改作为查询字符串放在链接上即可。这将强制浏览器刷新文件
<link rel="stylesheet" type="text/css" href="/css/style.min.css?v=<?= File::modified(path('public').'/css/style.min.css') ?>" />
我们还在CloudFront上定义了10个子域,因此浏览器不会达到同一个域6-8个并发请求的限制:
cdn0.example.com
cdn1.example.com
cdn2.example.com
... and so on
我们数据库中的每个条目都使用一个通过计算resource.id%10
选择的独占子域,这非常快,并且总是为每个实体返回相同的子域(帮助客户端和CloudFront缓存)。这是你能得到的最好的图像服务
UI图像存储在独占的子域assets.example.com
,这些图像到目前为止还没有版本化,因为我们不会对设计做太多更改,如果我们这样做,我们可能会将新的资产放在类似/v2/
或/newhemename/
文件夹中。这种方法对回滚甚至用户选择的主题都有很大帮助
CSS和JS由Apache从Laravel
/public
目录中提供。这不是最快的方法,但由于我们现在专注于开发,所以自动编译更少的代码和闭包就更重要了。当我们为最终用户启动时,我们可能会想到一个自动部署系统,它编译资产,使用时间戳前缀在S3/CloudFront上发布资产,并缓存它们的最后一个时间戳以进行视图渲染。这看起来是一个不错的解决方案,但不是最好的,因为大多数代理正在剥离查询字符串参数。尽管如此,我还是要试试,谢谢!我将编辑我的答案,并就如何实现这一点提供一些建议。这看起来是一个不错的解决方案,但不是最好的,因为查询字符串参数正在被大多数代理剥离。尽管如此,我还是要试试,谢谢!我将编辑我的答案,并就如何实现这一点提供更多建议。您可能想看看您可能想看看