Как перенаправить на страницу 404 в rout.rb?
Как я могу перенаправить неверный URL-адрес на страницу 404 в routs.rb? Сейчас я использую 2 примера кода:
# example 1
match "/go/(*url)", to: redirect { |params, request| Addressable::URI.heuristic_parse(params[:url]).to_s }, as: :redirect, format: false
# example 2
match "/go/(*url)", to: redirect { |params, request| Addressable::URI.heuristic_parse(URI.encode(params[:url])).to_s }, as: :redirect, format: false
Но когда я пытаюсь использовать русские слова в параметре 'url', в первом примере я получаю 500 страниц (неверный URI), во втором - я получаю перенаправление на stage.example.xn -org-yedaaa1fbbb/
Спасибо
2 ответа
Если вам нужны нестандартные страницы ошибок, вам лучше всего посмотреть ответ, который я написал несколько недель назад.
Вам нужно несколько важных элементов для создания пользовательских маршрутов ошибок:
-> Добавить пользовательский обработчик ошибок в application.rb
:
# File: config/application.rb
config.exceptions_app = self.routes
-> Создать /404
маршруты в вашем routes.rb
:
# File: config/routes.rb
if Rails.env.production?
get '404', :to => 'application#page_not_found'
end
-> Добавить actions
к контроллеру приложений для обработки этих маршрутов
# File: app/controllers/application_controller.rb
def page_not_found
respond_to do |format|
format.html { render template: 'errors/not_found_error', layout: 'layouts/application', status: 404 }
format.all { render nothing: true, status: 404 }
end
end
Это, очевидно, относительно простой, но, надеюсь, это даст вам больше идей о том, что вы можете сделать
Самое простое, что нужно сделать, - убедиться, что ваши маршруты не соответствуют плохим URL. По умолчанию Rails возвращает 404 для несуществующих маршрутов.
Если вы не можете сделать это, страница 404 по умолчанию живет в /404
так что вы можете перенаправить на это место. Однако здесь следует иметь в виду, что этот тип перенаправления будет выполнять перманентное перенаправление 301 вместо 302. Возможно, это не то поведение, которое вам нужно. Для этого вы можете сделать следующее:
match "/go/(*url)", to: redirect('/404')
Вместо этого я бы порекомендовал установить в вашем действии фильтр до, который вместо этого вызывает исключение не найден. Я не совсем уверен, находится ли это исключение в том же месте в Rails 4, но в Rails 3.2 я сейчас использую:
raise ActionController::RoutingError.new('Not Found')
Затем вы можете выполнить любую обработку и проверку URL в контроллере (если требуется сложная проверка формата URL).