• 谢谢大佬的认真回复。nginx 一直是关闭的。

    etag 的变化其实不在这个问题讨论的范畴了。etag 一旦不一致,服务端确实会返回 200,客户端也会收到 200。

    Rack::ConditionalGet 会比较 etag 和 last_modifed. 如果 etag 和请求的 If-None-Match 匹配的话,它会自动帮你改为 304

    之前看过这一段源码

    def fresh_when(object = nil, etag: nil, weak_etag: nil, strong_etag: nil, last_modified: nil, public: false, template: nil)
      weak_etag ||= etag || object unless strong_etag
      last_modified ||= object.try(:updated_at) || object.try(:maximum, :updated_at)
    
      if strong_etag
        response.strong_etag = combine_etags strong_etag,
          last_modified: last_modified, public: public, template: template
      elsif weak_etag || template
        response.weak_etag = combine_etags weak_etag,
          last_modified: last_modified, public: public, template: template
      end
    
      response.last_modified = last_modified if last_modified
      response.cache_control[:public] = true if public
    
      head :not_modified if request.fresh?(response)
    end
    
        def fresh?(response)
          last_modified = if_modified_since
          etag          = if_none_match
    
          return false unless last_modified || etag
    
          success = true
          success &&= not_modified?(response.last_modified) if last_modified
          success &&= etag_matches?(response.etag) if etag
          success
        end
    

    fresh_when 的最后一行的逻辑就是返回 304 的响应,但需要同时满足 etag 和 If-Modified-Since 这两项条件才行。当我的 if-modified-since 使用的是较老的时间时,当然不会 head :not_modified。日志中看到 render 200,但客户端显示了 304。

    我之前怀疑客户端收到的是 200,但由于某种逻辑 (比如返回的 etag 没有改变) 显示为 304,于是用 charles 抓包,但抓包结果就显示 304。

    我刚才又用 rails6.0.2.2 新建了一个纯净的项目,依然遇到了这个问题。但在一个不纯净的 rails6.0.2 版本上就没有遇到此问题

  • 兄弟你还是没明白我的问题。论坛里相关的帖子我都看过了

    当请求的资源没更新时,在 stale? @subjects时就会返回 304,客户端收到的也是 304,这是正常的,使用了客户端缓存。

    但资源更新后,用同样的请求,会执行render plain: 'stale', status: 200,从日志看,服务器返回的是 200。到这一步为止也是正常的。问题时客户端收到的不是 200,而是 304。

    而将 render 中的 status 改成 201、202、203 之类的,同样的请求,客户端就能正常显示 201、202、203,而非 304

  • 感叹一哈撒。8 年人生大起大落,回头一看,才二十六七岁。人生经验赶超我辈啊

  • 我知道 304 是使用客户端缓存,关键是我的服务器的 response status 是 200,为什么到了客户端就成了 304

  • 刺激!8 年过去了也比我年轻

  • 俺们不相信,哪的培训起步 12k

  • 专业!👍 👍 👍 明白了,2.7 中,单例类的类变量的查询不在 receivers' ancestors 上了,而以前版本的查询又有 bug。

  • 确实😅 。2.7 里修正了这个行为,只能通过A.singleton_class.singleton_class.class_variables来获取了

  • 居然行了,但是想不通原因

  • 😂 ,我想错模型了