Rails 3では、スラッシュが付いている標準URLに後ろにスラッシュを付けずにURLからリダイレクトしようとしています。Rails 3の後ろにスラッシュを入れずに標準ルートにリダイレクト
match "/test", :to => redirect("/test/")
ただし、上記のルートは/ testと/ test /の両方に一致し、リダイレクトループを引き起こします。
スラッシュのないバージョンのみに一致させる方法を教えてください。
Rails 3では、スラッシュが付いている標準URLに後ろにスラッシュを付けずにURLからリダイレクトしようとしています。Rails 3の後ろにスラッシュを入れずに標準ルートにリダイレクト
match "/test", :to => redirect("/test/")
ただし、上記のルートは/ testと/ test /の両方に一致し、リダイレクトループを引き起こします。
スラッシュのないバージョンのみに一致させる方法を教えてください。
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アプリケーションで同じタスクを実行できます。
は、多分それは私がブログにcannonical URLを持つように同じことをやってみたかった
match "/test$", :to => redirect("/test/")
いいえ、うまくいきません –
と連携し、これはその後
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番目になる。
コントローラレベルで強制的にリダイレクトすることができます。
# 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
'original_url'にはクエリパラメータも含まれていますので、このチェックはあまりにも多くをキャッチします。 – cburgmer
ラックリライトは興味深いオプションです。可能であれば、追加のミドルウェアを使用せずにWebサーバー側で実行することなく、Railsのソリューションを好むでしょう。 –
実際、 'redirect("/test/")を呼び出すと、Rackミドルウェアを使用しています。 ;) –