2013-10-29 25 views
6

Come posso reindirizzare l'url non corretto alla pagina 404 in routes.rb? ora uso di codice 2 esempi:Come reindirizzare a 404 pagine in 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 

Ma quando provo utilizzando parole russe nel parametro 'url', nel primo esempio ottengo 500 pagine (male URI), nel 2 ° - I get reindirizzare a stage.example .xn - org-yedaaa1fbbb/

Grazie

+0

Puoi fornire alcuni esempi di URL che stai tentando di utilizzare? –

+0

Alcuni esempi: stage.example.org/go/газета stage.example.org/go/газета.рф – piton4eg

risposta

18

Se volete pagine di errore personalizzate, sarete meglio guardando this answer ho scritto un paio di settimane fa,


avete bisogno di diversi elementi importanti per creare percorsi personalizzati di errore:

->Aggiungere gestore degli errori personalizzato in application.rb:

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

->Crea /404 percorsi nel file routes.rb:

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

->Aggiungi actions al controllore di applicazione per gestire questi percorsi

#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 

Questo è ovviamente relativamente semplice, ma si spera che vi darà qualche idea in più su cosa è possibile fare

+0

Grazie per la risposta – piton4eg

2

La cosa più semplice da fare è assicurarsi che i percorsi non corrispondono URL male. Di default Rails restituirà un 404 per rotte che non esistono.

Se non riesci a farlo, la pagina 404 predefinita risiede su /404 in modo che tu possa reindirizzare a quella posizione. Tuttavia, è importante tenere presente che questo tipo di reindirizzamento eseguirà un reindirizzamento permanente 301 anziché 302. Questo potrebbe non essere il comportamento desiderato. Per fare questo è possibile effettuare le seguenti operazioni:

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

Invece, mi consiglia la creazione di un filtro prima nella vostra azione che genera invece un'eccezione non trovato. Io non sono esattamente sicuro se questa eccezione è nello stesso posto in Rails 4, ma con Rails 3.2 Attualmente sto usando:

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

si può quindi fare qualsiasi elaborazione e l'URL del check-in del controller (se complicata è richiesto il controllo del formato dell'URL).

Problemi correlati