2013-10-29 19 views
6

Làm cách nào để chuyển hướng url không chính xác đến trang 404 trong routes.rb? Bây giờ tôi sử dụng 2 ví dụ mã:Cách chuyển hướng đến trang 404 trong 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 

Nhưng khi tôi cố gắng sử dụng những từ Nga trong tham số 'url', trong ví dụ 1st tôi nhận được 500 trang (xấu URI), trong 2 - Tôi có được chuyển hướng đến stage.example .xn - org-yedaaa1fbbb/

Cảm ơn

+0

Bạn có thể cung cấp một số URL mẫu mà bạn đang cố gắng sử dụng không? –

+0

Một số mẫu: stage.example.org/go/газета stage.example.org/go/газета.рф – piton4eg

Trả lời

18

Nếu bạn muốn trang lỗi tùy chỉnh, bạn sẽ được tìm kiếm tốt nhất tại this answer Tôi đã viết một vài tuần trước


Bạn cần một số yếu tố quan trọng để tạo ra các tuyến đường lỗi tùy chỉnh:

->Thêm xử lý lỗi tùy chỉnh trong application.rb:

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

->Tạo /404 tuyến đường trong tập tin routes.rb của bạn:

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

->Thêm actions để điều khiển ứng dụng để xử lý các đường bay

#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 

này rõ ràng là tương đối cơ bản, nhưng hy vọng nó sẽ cung cấp cho bạn một số ý tưởng hơn về những gì bạn có thể làm

+0

Cảm ơn bạn đã trả lời – piton4eg

2

điều đơn giản nhất để làm là để đảm bảo tuyến đường của bạn không phù hợp với URL xấu. Theo mặc định, Rails sẽ trả lại 404 cho các tuyến đường không tồn tại.

Nếu bạn không thể thực hiện việc này, trang 404 mặc định sẽ hiển thị ở số /404 để bạn có thể chuyển hướng đến vị trí đó. Tuy nhiên, điều cần lưu ý ở đây là loại chuyển hướng này sẽ thực hiện Chuyển hướng vĩnh viễn 301 thay vì 302. Đây có thể không phải là hành vi mà bạn muốn. Để thực hiện việc này, bạn có thể thực hiện các thao tác sau:

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

Thay vào đó, tôi khuyên bạn nên thiết lập bộ lọc trước trong hành động thay vì làm tăng ngoại lệ không tìm thấy. Tôi không chắc chắn chính xác nếu ngoại lệ này nằm ở cùng một vị trí trong Rails 4, nhưng với Rails 3.2 Tôi hiện đang sử dụng:

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

Sau đó bạn có thể làm bất cứ chế biến và URL kiểm tra trong bộ điều khiển (nếu phức tạp kiểm tra định dạng URL là bắt buộc).

Các vấn đề liên quan