27

401ステータスコードを設定できるように、Deviseの失敗応答をオーバーライドしています。ただし、ユーザーがサインインに失敗すると、「リダイレクトされています」リンクのあるページにリダイレクトされます。これを:status => 401リダイレクトから削除すると、正常に機能します。

class CustomFailure < Devise::FailureApp
    def redirect_url
      new_user_session_url(:subdomain => 'secure')
    end

    def respond
        if http_auth?
           http_auth
        else
           store_location!
           flash[:alert] = i18n_message unless flash[:notice]
           redirect_to redirect_url, :status => 401
        end
    end
end

編集

または、フラッシュメッセージを表示して同じページにとどまりますが、次のコード行を追加します。

render :text => "unauthorized", :status => 401

ルビーに文句を言う:

undefined method `render' for #<CustomFailure:0x00000103367f28>

ここで何が起こっているのですか?

4

4 に答える 4

42

リダイレクションの適切なHTTPステータスは30x形式です(301と302が最も頻繁に使用されます)。デフォルトでは、redirect_toヘルパーはHTTP応答に302ステータスヘッダーを設定します。これをオーバーライドして401に設定すると、Webブラウザーは、応答が通常のWebページであると見なし、応答本文をレンダリングします。これは、リダイレクトでは、「リダイレクトされています」という定型テキストです。

于 2010-11-30T06:32:10.433 に答える
2

@pantulisが言ったように、応答コードが3xxでない場合、ブラウザはこの標準メッセージを表示します

これを回避するには、javascriptリダイレクトを実行できます。

# example with status 500:
render text: "<script>window.location = '#{url}';</script>", status: 500

これは、すべてのユーザーがjavascriptを使用していることが確実な場合にのみ有効です。javascriptを無効にしている可能性のあるユーザーがアプリケーションを閲覧できる場合はnoscript、標準の「リダイレクトされています」メッセージにタグとフォールバックも含める必要があります

于 2015-01-10T23:39:31.913 に答える
1

私は実際にQAサーバーでこの問題に遭遇していましたが、ローカルでは発生していませんでした。memcacheがメッセージをインターセプトして200としてレンダリングし、このメッセージを表示させていることが判明しました。これは、GETからのリダイレクトを予期していなかったmemcache設定が間接的に原因でした。

From: 
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @memcached

To:
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @rails
于 2013-02-26T22:34:20.183 に答える
1

私がこの問題を抱えているとき、私が過去にしたことは次のようなものです:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  after_filter :check_page_content
  ...
  private
  def check_page_content
    if response.body.include? "You are being"
      html_doc = Nokogiri::HTML(response.body)
      uri = html_doc.css('a').map { |link| link['href'] }.first
      response.body = "<script>
                         window.location.replace('#{uri}');
                       </script>"
    end
  end
end

私がしているのは、ページのコンテンツが「あなたがいる」かどうかを確認することです。これが本当なら、私は自分がなりたい場所にいないことを知っています。そして、Javascriptの助けを借りて、ページを本当に行きたい場所に更新するだけです。私はそれが最もエレガントな解決策ではないことを知っていますが、それは本当に役立ちます

ハッピーハッキング

于 2017-06-03T15:57:08.703 に答える