2013-10-29 21 views
6

Jak mogę przekierować nieprawidłowy adres URL do strony 404 w routes.rb? Teraz używam kodu 2 Przykłady:Jak przekierować na stronę 404 w routes.rb?

# 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 

Ale gdy próbuję przy użyciu wyrazów języka rosyjskiego w parametrze „url”, w 1st przykład mam 500 strony (złe URI), 2-giej - mogę przekierować do stage.example .xn - org-yedaaa1fbbb/

Dzięki

+0

Czy możesz podać kilka przykładowych adresów URL, których próbujesz użyć? –

+0

Kilka przykładów: stage.example.org/go/газета stage.example.org/go/газета.рф – piton4eg

Odpowiedz

18

Jeśli chcesz niestandardowych stron błędów, będziesz najlepiej patrząc na this answer pisałem kilka tygodni temu


Trzeba kilka ważnych elementów do tworzenia tras zwyczaj błędach:

->Dodaj niestandardowej obsługi błędów w environment.rb:

#config/application.rb 
config.exceptions_app = self.routes 

->Tworzenie /404 trasy w pliku routes.rb:

config/routes.rb 
if Rails.env.production? 
    get '404', :to => 'application#page_not_found' 
end 

->Dodaj actions do kontrolera aplikacji do obsługi tych tras

#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 

To jest oczywiście stosunkowo prosty, ale mam nadzieję, że to da ci trochę więcej pomysłów co możesz zrobić?

+0

Dzięki za odpowiedź – piton4eg

2

najprostszą rzeczą do zrobienia jest, aby upewnić się, że drogi nie pasują złe adresy URL. Domyślnie Railsy zwrócą 404 dla tras, które nie istnieją.

Jeśli nie możesz tego zrobić, domyślna strona 404 mieszka pod numerem /404, dzięki czemu możesz przekierować do tej lokalizacji. Należy jednak pamiętać, że ten typ przekierowania będzie wykonywać stałe przekierowanie 301 zamiast 302. Może to nie być pożądane zachowanie. Aby to zrobić, można wykonać następujące czynności:

match "/go/(*url)", to: redirect('/404') 

Zamiast tego polecam utworzenie zanim filtr w swoim działaniu, które zamiast podnosi się nie znaleziono wyjątku. Nie jestem do końca pewien, czy ten wyjątek jest w tym samym miejscu w szynach 4, ale z Rails 3.2 Obecnie używam:

raise ActionController::RoutingError.new('Not Found') 

Następnie można wykonywać żadnej przetwarzanie i sprawdzanie URL w sterowniku (jeżeli skomplikowane wymagane jest sprawdzenie formatu adresu URL).

Powiązane problemy