ArgumentError (сравнение Time со String не удалось) в контроллере стилей

У меня довольно типичная настройка с подпапкой/реверс-прокси с использованием Apache в качестве реверс-прокси.

Сначала возникли проблемы с небезопасными ресурсами, поэтому я установил переменную окружения force_https. Теперь при запросе таких ресурсов, как stylesheets/color_definitions_light_7_1_6cfae4de9c47a1b8ed3d5748018236d10ea9107e.css?__ws=site.com,

Возможно, я делаю что-то глупое, но получаю следующую ошибку:

ArgumentError (сравнение объекта Time со строкой не удалось)
app/controllers/stylesheets_controller.rb:66:in `<='
app/controllers/stylesheets_controller.rb:66:in `show_resource'
app/controllers/stylesheets_controller.rb:19:in `show'
app/controllers/application_controller.rb:414:in `block in with_resolved_locale'
app/controllers/application_controller.rb:414:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'
1 лайк

Что ж, судя по

переменная stylesheet_time является строкой, поэтому изменение этой строки на

    if cache_time && stylesheet_time && stylesheet_time.to_date <= cache_time

решает проблему. Я не понимаю, почему это происходит сейчас, так как я не вижу никаких недавних коммитов, влияющих на это.

Вот как это установлено:

    stylesheet_time = query.pick(:created_at)

Казалось бы, что :created_at должен быть корректной датой. Возможно, изменилась какая-то базовая библиотека (gem)? И как это не было выявлено в тестах?

1 лайк

Вот что, похоже, исправляет проблему:

    if !cache_time.to_date.nil? && !stylesheet_time.to_date.nil? 
      if (stylesheet_time.to_date <= cache_time.to_date)
        return render body: nil, status: 304
      end 
    end

Кажется, возможно, что to_date превращает что-то истинное в nil-дату, полагаю.

Нет. Это тоже не работает. В итоге я обернул этот блок в begin/rescue/end.

Я очень смущён тем, как это может влиять только на эту подпапку/сайт с обратным прокси.

Возможно, это связано с

      cache_time = request.env["HTTP_IF_MODIFIED_SINCE"]

и, возможно, это значение не передаётся через Apache или что-то в этом роде — либо передаётся некорректная строка даты.

Раньше там был rescue nil, но это было 5 лет назад.

И, думаю, отладка сложна, так как это кэш, поэтому для отладки мне нужно было бы очистить этот кэш, чтобы проверить, работает ли он.

1 лайк

У меня была та же проблема (также при использовании настройки подпапки). После устранения предупреждения о смешанном контенте, не связанного с этим, путем установки параметра force_https в значение true, проблема исчезла…

2 лайка

Чёрт. Я надеялся, что это меня спасёт, но у меня уже есть DISCOURSE_FORCE_HTTPS: true в yml.

Теперь я ещё больше запутался, почему проблема только на этом одном сайте.

Я изменил настройку «принудительный HTTPS» в интерфейсе администратора, но, вероятно, это то же самое.

1 лайк

Привет!

У меня возникла точно такая же проблема с NGINX вместо Apache в качестве обратного прокси.
Вам удалось найти решение?

Кстати, ошибка возникает только в десктопной версии, с мобильной версией всё работает без проблем.
Я обошёл это, отключив буферизацию на обратном прокси.

1 лайк

@pfaffman Я просто откатился с версии 3.1.0.beta3 до 3.1.0.beta2, всё прошло гладко, и теперь всё работает как положено.

У меня недостаточно опыта работы с Discourse, чтобы проверить, что пошло не так, или сообщить об ошибке, особенно в случае установки, не поддерживаемой официально.

Но если я могу чем-то помочь, буду рад!