Перенаправление на канонический маршрут без косой черты в Rails 3 - PullRequest
4 голосов
/ 21 декабря 2011

В Rails 3 я пытаюсь перенаправить URL-адрес без завершающей косой черты на канонический URL-адрес, который имеет косую черту.

match "/test", :to => redirect("/test/")

Однако вышеприведенный маршрут совпадает с / test и / test /, вызывая петлю перенаправления.

Как мне сделать так, чтобы он совпадал только с версией без косой черты?

Ответы [ 4 ]

5 голосов
/ 22 января 2014

Вы можете принудительно перенаправить на уровне контроллера.

# File: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  protected

  def force_trailing_slash
    redirect_to request.original_url + '/' unless request.original_url.match(/\/$/)
  end
end

# File: app/controllers/test_controller.rb
class TestController < ApplicationController

  before_filter :force_trailing_slash, only: 'test'  # The magic

  # GET /test/
  def test
    # ...
  end
end
2 голосов
/ 11 сентября 2012

Я хотел сделать то же самое, чтобы иметь канонический URL для блога, это работает

  match 'post/:year/:title', :to => redirect {|env, params| "/post/#{params[:year]}/#{params[:title]}/" }, :constraints => lambda {|r| !r.original_fullpath.end_with?('/')}
  match 'post/:year/:title(/*file_path)' => 'posts#show', :as => :post, :format => false

, тогда у меня есть другое правило, которое касается относительных путей внутри поста.Порядок важен, поэтому первый идет первым, а общий - вторым.

2 голосов
/ 21 декабря 2011

В ActionDispatch есть опция trailing_slash, которую можно использовать для принудительного добавления косой черты в конце URL-адреса. Я не уверен, что его можно использовать в определении маршрутизации.

def tes_trailing_slsh
  add_host!
  options = {:controller => 'foo', :trailing_slash => true, :action => 'bar', :id => '33'}
  assert_equal('http://www.basecamphq.com/foo/bar/33/', W.new.url_for(options) )
end

В вашем случае лучше всего использовать Rack или ваш веб-сервер для выполнения перенаправления. В Apache вы можете добавить определение, например

RewriteEngine on
RewriteRule ^(.+[^/])$ $1/  [R=301,L]

Чтобы перенаправить все маршруты без косой черты на соответствующий с косой чертой.

Или вы можете использовать перезапись стойки , чтобы выполнить ту же задачу в приложении Rails на уровне стойки.

0 голосов
/ 21 декабря 2011

Может быть, это работает с

match "/test$", :to => redirect("/test/")
...