2013-10-29 12 views
6

Wie kann ich falsche URL auf 404-Seite in routes.rb umleiten? Jetzt benutze ich zwei Beispiele Code:Wie Umleitung auf 404-Seite 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 

Aber wenn ich russische Wörter in ‚url‘ Parameter versuchen Sie es mit, in der 1. Beispiel erhalte ich 500 Seite (schlecht URI), in der 2. - ich umleiten stage.example .xn - org-yedaaa1fbbb/

Dank

+0

Können Sie einige Beispiel-URLs angeben, die Sie verwenden möchten? –

+0

Einige Beispiele: stage.example.org/go/gaszta stage.example.org/go/gaszta.fr – piton4eg

Antwort

18

Wenn Sie benutzerdefinierte Fehlerseiten wollen, werden Sie am besten bei this answer suchen werden, schrieb ich vor ein paar Wochen


Sie einige wichtige Elemente müssen Routen individuelle Fehler erstellen:

->Fügen Sie Handler individuelle Fehler in application.rb:

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

->erstellen /404 Routen in Ihrer routes.rb Datei:

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

->hinzufügen actions zur Anwendungssteuerung diese Routen zu handhaben

#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 

Das ist offensichtlich relativ basisch ist, aber hoffentlich wird es Ihnen einige weitere Ideen geben Was können Sie tun?

+0

Danke für die Antwort – piton4eg

2

Die einfachste Sache zu tun ist, um sicherzustellen, dass Ihre Routen passen nicht schlecht URLs. Standardmäßig gibt Rails einen 404 für Routen zurück, die nicht existieren.

Wenn dies nicht möglich ist, wird die 404-Standardseite unter /404 gespeichert, sodass Sie auf diesen Speicherort umleiten können. Beachten Sie jedoch, dass diese Art der Weiterleitung eine 301 Permanent Redirect anstelle von 302 durchführt. Dies ist möglicherweise nicht das gewünschte Verhalten. Dazu können Sie wie folgt vorgehen:

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

Stattdessen würde ich empfehlen die Einrichtung einer vor-Filter in Ihrer Aktion, die stattdessen wirft nicht gefunden Ausnahme. Ich bin mir nicht ganz sicher, ob diese Ausnahme an der gleichen Stelle ist in Rails 4, jedoch mit Rails 3.2 Ich bin derzeit mit:

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

Anschließend können Sie tun, um jede Verarbeitung und URL in der Steuerung überprüfen (wenn komplizieren Überprüfung des URL-Formats ist erforderlich).

Verwandte Themen