常數
ILLEGAL_HEADER_VALUE_REGEX | = | /[\x00-\x08\x0A-\x1F]/.freeze |
實例公開方法
redirect_back(fallback_location:, allow_other_host: _allow_other_host, **args) 連結
軟棄用別名,用於 redirect_back_or_to
,其中 fallback_location
位置提供為關鍵字引數,而非第一個位置引數。
來源:顯示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/redirecting.rb, line 101 def redirect_back(fallback_location:, allow_other_host: _allow_other_host, **args) redirect_back_or_to fallback_location, allow_other_host: allow_other_host, **args end
redirect_back_or_to(fallback_location, allow_other_host: _allow_other_host, **options) 連結
如果可能,將瀏覽器重新導向到發出請求的頁面(參考來源),否則重新導向到提供的預設備用位置。
參考來源資訊從請求中的 HTTP Referer
(原文如此)標頭中提取。這是一個選用標頭,其存在於請求中會受到瀏覽器安全性設定和使用者偏好的影響。如果請求中缺少此標頭,將會使用 fallback_location
。
redirect_back_or_to({ action: "show", id: 5 })
redirect_back_or_to @post
redirect_back_or_to "http://www.rubyonrails.org"
redirect_back_or_to "/images/screenshot.jpg"
redirect_back_or_to posts_url
redirect_back_or_to proc { edit_post_url(@post) }
redirect_back_or_to '/', allow_other_host: false
選項
-
:allow_other_host
- 允許或不允許重新導向到與目前主機不同的主機,預設為 true。
所有其他可以傳遞給 redirect_to
的選項都接受為選項,且行為相同。
來源:顯示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/redirecting.rb, line 127 def redirect_back_or_to(fallback_location, allow_other_host: _allow_other_host, **options) if request.referer && (allow_other_host || _url_host_allowed?(request.referer)) redirect_to request.referer, allow_other_host: allow_other_host, **options else # The method level `allow_other_host` doesn't apply in the fallback case, omit and let the `redirect_to` handling take over. redirect_to fallback_location, **options end end
redirect_to(options = {}, response_options = {}) 連結
將瀏覽器重新導向到 options
中指定的目標。此參數可以是下列任一項
-
Hash
- URL 將透過使用options
呼叫 url_for 來產生。 -
Record
- URL 將透過使用options
呼叫 url_for 來產生,這將參考該記錄的名稱 URL。 -
String
以protocol://
(例如http://
) 或協定相關參考 (例如//
) 開頭 - 直接傳遞作為重新導向的目標。 -
不包含協定的
String
- 目前的協定和主機會加到字串前面。 -
Proc
- 將在控制器內容中執行的區塊。應傳回redirect_to
接受的任何選項。
範例
redirect_to action: "show", id: 5
redirect_to @post
redirect_to "http://www.rubyonrails.org"
redirect_to "/images/screenshot.jpg"
redirect_to posts_url
redirect_to proc { edit_post_url(@post) }
重新導向會以 302 Found
標頭發生,除非使用 :status
選項另行指定
redirect_to post_url(@post), status: :found
redirect_to action: 'atom', status: :moved_permanently
redirect_to post_url(@post), status: 301
redirect_to action: 'atom', status: 302
狀態碼可以是標準的 HTTP 狀態碼 (整數),或代表小寫、底線和符號化描述的符號。請注意,狀態碼必須是 3xx HTTP 碼,否則不會發生重新導向。
如果您使用 GET 或 POST 以外的 XHR 要求,並在要求後重新導向,則某些瀏覽器會使用原始要求方法遵循重新導向。這可能會導致不理想的行為,例如重複刪除。為了解決這個問題,您可以傳回 303 See Other
狀態碼,它將使用 GET 要求來遵循。
redirect_to posts_url, status: :see_other
redirect_to action: 'index', status: 303
也可以在重新導向中指定快閃訊息。有兩個特別存取器,用於常用的快閃名稱 alert
和 notice
,以及一個通用 flash
區塊。
redirect_to post_url(@post), alert: "Watch it, mister!"
redirect_to post_url(@post), status: :found, notice: "Pay attention to the road"
redirect_to post_url(@post), status: 301, flash: { updated_post_id: @post.id }
redirect_to({ action: 'atom' }, alert: "Something serious happened")
控制器中 redirect_to
之後的陳述式會執行,因此 redirect_to
不會停止函式的執行。若要在 redirect_to
之後立即終止函式的執行,請使用 return。
redirect_to post_url(@post) and return
開放重新導向保護
預設情況下,Rails 會保護您的應用程式免於重新導向到外部主機,這稱為開放式重新導向。注意:這是 Rails 7.0 的新預設值,升級後,透過取消註解 config/initializers/new_framework_defaults_7_0.rb
中包含 raise_on_open_redirects
的行來選擇加入。
在這裡 redirect_to
會自動驗證潛在不安全的網址
redirect_to params[:redirect_url]
在不安全的重新導向情況下,會引發 UnsafeRedirectError
。
若要允許任何外部重新導向,請傳遞 allow_other_host: true
,不過在這種情況下使用使用者提供的參數是不安全的。
redirect_to "https://rubyonrails.org", allow_other_host: true
請參閱 url_from
,以取得關於什麼是內部且安全的網址,或如何在不安全的情況下回退到備用重新導向網址的更多資訊。
來源:顯示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/redirecting.rb, line 84 def redirect_to(options = {}, response_options = {}) raise ActionControllerError.new("Cannot redirect to nil!") unless options raise AbstractController::DoubleRenderError if response_body allow_other_host = response_options.delete(:allow_other_host) { _allow_other_host } self.status = _extract_redirect_to_status(options, response_options) redirect_to_location = _compute_redirect_to_location(request, options) _ensure_url_is_http_header_safe(redirect_to_location) self.location = _enforce_open_redirect_protection(redirect_to_location, allow_other_host: allow_other_host) self.response_body = "" end
url_from(location) 連結
驗證傳遞的 location
是否是安全的內部網址,可以重新導向到該網址,並傳回該網址,如果不行,則傳回 nil。這有助於包裝參數提供的重新導向網址,並回退到備用的重新導向網址
redirect_to url_from(params[:redirect_url]) || root_url
如果 location
與 request.host
位於相同主機上,則會視為內部且安全
# If request.host is example.com:
url_from("https://example.com/profile") # => "https://example.com/profile"
url_from("http://example.com/profile") # => "http://example.com/profile"
url_from("http://evil.com/profile") # => nil
次網域被視為主機的一部分
# If request.host is on https://example.com or https://app.example.com, you'd get:
url_from("https://dev.example.com/profile") # => nil
注意:這與 url_for 類似,它會從應用程式內的各種選項產生內部網址,例如 url_for(@post)
。不過,url_from
的目的是接收外部參數進行驗證,就像 url_from(params[:redirect_url])
一樣。
來源:顯示 | 在 GitHub 上
# File actionpack/lib/action_controller/metal/redirecting.rb, line 175 def url_from(location) location = location.presence location if location && _url_host_allowed?(location) end