gpt4 book ai didi

ruby-on-rails - 设置 public_file_server.headers 除了一些文件

转载 作者:行者123 更新时间:2023-12-04 15:06:22 25 4
gpt4 key购买 nike

我在 production.rb 中使用它:

config.public_file_server.headers = {
'Cache-Control' => 'public, s-maxage=31536000, maxage=31536000',
'Expires' => "#{1.year.from_now.to_formatted_s(:rfc822)}"
}

我通过 cdn.mydomain.com 使用公共(public)文件,该文件从 www.mydomain.com 读取,并从 www.mydomain.com 复制缓存控制,这是我使用 public_file_server.headers 设置的。

问题是我希望/public 中的一些文件没有那些缓存控制,例如我的 service-worker.js

例如,有没有办法为/public 中的一个文件夹设置这些缓存控制?

另一种解决方案是删除此 public_file_server.headers 配置,并在 cdn 级别设置缓存控制(我使用 cdn.mydomain.com/publicfile),并为服务保持 www.mydomain.com/serviceworker 没有缓存控制 worker 。

但也许有机会在 Rails 级别进行配置?

最佳答案

我遇到了完全相同的问题:使用 CDN (Cloudfront) 使用 Rails 构建的 PWA。对于我想使用的缓存 header 具有远期过期的 Assets ,但 ServiceWorker 需要 Cache-control: No-cache .
因为 CloudFront 本身不允许添加或更改 header ,所以我需要一个应用级别的解决方案。经过一番研究,我在 blogpost 中找到了解决方案.这个想法是通过 public_file_server.headers 设置标题并添加一个中间件来更改 ServiceWorker 文件的内容。
另外,你写了maxage= ,应该是max-age= .
这是我使用的代码:
生产.rb:

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.public_file_server.headers = {
'Cache-Control' => 'public, s-maxage=31536000, max-age=15552000',
'Expires' => 1.year.from_now.to_formatted_s(:rfc822)
}

if ENV['RAILS_SERVE_STATIC_FILES'].present?
config.middleware.insert_before ActionDispatch::Static, ServiceWorkerManager, ['sw.js']
end
应用程序/中间件/service_worker_manager.rb:
# Taken from https://codeburst.io/service-workers-rails-middleware-841d0194144d
#
class ServiceWorkerManager
# We’ll pass 'service_workers' when we register this middleware.
def initialize(app, service_workers)
@app = app
@service_workers = service_workers
end

def call(env)
# Let the next middleware classes & app do their thing first…
status, headers, response = @app.call(env)
dont_cache = @service_workers.any? { |worker_name| env['REQUEST_PATH'].include?(worker_name) }

# …and modify the response if a service worker was fetched.
if dont_cache
headers['Cache-Control'] = 'no-cache'
headers.except!('Expires')
end

[status, headers, response]
end
end

关于ruby-on-rails - 设置 public_file_server.headers 除了一些文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com