4

Rails 3では、スラッシュが付いている標準URLに後ろにスラッシュを付けずにURLからリダイレクトしようとしています。Rails 3の後ろにスラッシュを入れずに標準ルートにリダイレクト

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

ただし、上記のルートは/ testと/ test /の両方に一致し、リダイレクトループを引き起こします。

スラッシュのないバージョンのみに一致させる方法を教えてください。

答えて

2

trailing_slashという名前のActionDispatchには、末尾にスラッシュを付けるオプションがあります。ルーティング定義で使用できるかどうかはわかりません。

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またはWebサーバーを使用してリダイレクトを実行することです。アパッチで は、あなたはスラッシュを末尾に対応するものに末尾のスラッシュなしですべてのルートをリダイレクトするには、このような

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

として定義を追加することができます。

またはrack-rewriteを使用して、RailsレベルでRailsアプリケーションで同じタスクを実行できます。

+0

ラックリライトは興味深いオプションです。可能であれば、追加のミドルウェアを使用せずにWebサーバー側で実行することなく、Railsのソリューションを好むでしょう。 –

+1

実際、 'redirect("/test/")を呼び出すと、Rackミドルウェアを使用しています。 ;) –

0

は、多分それは私がブログにcannonical URLを持つように同じことをやってみたかった

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

いいえ、うまくいきません –

2

と連携し、これはその後

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番目になる。

3

コントローラレベルで強制的にリダイレクトすることができます。

# 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 
+1

'original_url'にはクエリパラメータも含まれていますので、このチェックはあまりにも多くをキャッチします。 – cburgmer

関連する問題