Вопрос или проблема
Просто делаю простое приложение “Hello World” на Ruby on Rails: https://guides.rubyonrails.org/getting_started.html#using-concerns
Очень просто, но почему-то я сталкиваюсь с проблемой, когда открываю URL http://localhost:3000/articles в браузере.
Это вызов из клиента REST, который работает
Started GET "/articles" for ::1 at 2024-09-19 21:13:06 -0700
Processing by ArticlesController#index as */*
Rendering layout layouts/application.html.erb
Rendering articles/index.html.erb within layouts/application
Rendered articles/index.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
Rendered layout layouts/application.html.erb (Duration: 300.6ms | GC: 83.0ms)
Completed 200 OK in 305ms (Views: 303.0ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 83.0ms)
Это вызов из браузера, который не работает
Started GET "/articles" for ::1 at 2024-09-19 21:14:13 -0700
Processing by ArticlesController#index as HTML
Rendering public/406-unsupported-browser.html
Rendered public/406-unsupported-browser.html (Duration: 0.5ms | GC: 0.0ms)
Filter chain halted as #<Proc:0x000000010faa86f0 /Users/joe/.rbenv/versions/3.3.4/lib/ruby/gems/3.3.0/gems/actionpack-7.2.1/lib/action_controller/metal/allow_browser.rb:48 (lambda)> rendered or redirected
Completed 406 Not Acceptable in 5ms (Views: 1.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 1.8ms)
Меня интересует, в чем проблема: ArticlesController#index as HTML
, когда похоже, что моё приложение возвращает layouts/application.html.erb
Я пробовал как в Chrome, так и в Safari, но без успеха. Насторожило то, что если я сохраняю ответ клиента REST как whatever.html и открываю его в Chrome, он отображается нормально.
Для тех, кто столкнулся с подобной проблемой
Закомментировав строку allow browser modern в вашем контроллере приложения, я решил проблему
Ответ или решение
Проблема, с которой вы столкнулись, возникает из-за механизма, встроенного в ваш Ruby on Rails-приложение, который обрабатывает HTTP-заголовок Accept
, передаваемый браузером. Как видно из логов, REST-клиент отправляет запрос с заголовком Accept: */*
, тогда как ваш браузер может отправлять запрос с заголовком Accept: text/html
.
Когда вы попытались открыть URL-адрес http://localhost:3000/articles
в браузере, сервер отошел к ошибке 406 Not Acceptable, что означает, что он не смог обработать запрос из-за некорректных заголовков. В данном случае приложение отправляет ответ 406-unsupported-browser.html
, что указывает на то, что ваше приложение настроено для отклонения запросов от «неконтролируемых» или «устаревших» браузеров.
Решение вашей проблемы заключается в отключении проверки браузера, которая, вероятно, была включена в вашем ApplicationController
. Как вы уже заметили, комментирование строки, относящейся к allow_browser modern
, приводит к правильной обработке запроса. Возможно, это выглядит как следующее:
class ApplicationController < ActionController::Base
# ... другие настройки ...
# закомментируйте или удалите следующую строку
# allow_browser :modern
end
После внесения этих изменений ваше приложение должно обрабатывать запросы из браузера должным образом.
Важно отметить, что отключение этой функции может снизить безопасность приложения, так как она предназначена для защиты от старых или небезопасных браузеров. Вам стоит рассмотреть возможность настройки или обновления механизма, который проверяет поддерживаемые браузеры, чтобы избежать этой проблемы в будущем, не подвергая приложение риску, связанному с безопасностью.
Если вы хотите оставить проверку браузера включенной, возможно, стоит рассмотреть обновление вашего браузера или его настройку, чтобы он отправлял корректные заголовки в соответствии с вашими требованиями. Тем не менее, отмена этой проверки является более простым решением, которое устраняет вашу текущую проблему.