19

ここ数日、Googleボットがメインのホームページ(ようこそ/インデックス)にアクセスしようとすると、テンプレートが見つからないというエラーが発生し始めました。私はこれを数時間見つめていましたが、単純なものが欠けていることを知っています。

A ActionView::MissingTemplate occurred in welcome#index:
Missing template welcome/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>["*/*;q=0.9"], :locale=>[:en, :en]}

ただし、テンプレートは存在します(index.html.haml)。そうでなければ、誰も私たちのホームページにアクセスできませんでした。

追加の環境情報は次のとおりです。

* REMOTE_ADDR                               : 66.249.72.139
* REMOTE_PORT                               : 56883
* REQUEST_METHOD                            : GET
* REQUEST_URI                               : /

* Parameters: {"controller"=>"welcome", "action"=>"index"}

あなたが持っている洞察は大歓迎です。

4

4 に答える 4

16

これらのエラーは、 GoogleBot がヘッダーをフォーマットHTTP_ACCEPTする方法に起因しています。有効ですが ( W3 リファレンスを参照)、セパレーターとして使用されるq=0.6 (最後の数字は変更される可能性があります) が追加されます。他のメディア タイプが指定されていないため、これq=0.6は必要ありません。これが、Rails がヘッダーを正しく処理しない理由だと思います。

(Railsのバージョンにもよるようです。Rails 3.0.12ではMissingTemplate例外が発生します。)

関連するコントローラーへの以前の回答から次のコードを追加するだけでは不十分です。エラーで応答します406

respond_to do |format|
  format.html
end

Rails 3.0.12 でこれを機能させ、GoogleBot に何か(エラーよりも良い) を返すには、 -likeが検出されるとすぐに406リクエストの形式を に設定するこのコードを追加する必要があります(Rails はヘッダー値を に読み込みます) 。 .html*/*;q=0.6HTTP_ACCEPTrequest.format

# If the request 'HTTP_ACCEPT' header indicates a '*/*;q=0.6' format,
# we set the format to :html.
# This is necessary for GoogleBot which perform its requests with '*/*;q=0.6'
# or similar HTTP_ACCEPT headers.
if request.format.to_s =~ %r%\*\/\*%
  request.format = :html
end

respond_to do |format|
  format.html
end

作業中、このソリューションでは、GoogleBot によってインデックスを作成するコントローラー アクションにコードを追加する必要があります。これは実際には DRY ではありません。

この問題を完全に解決するために、私は小さな Rack ミドルウェアを実装しました。これはさらに優れています。リクエストのHTTP_ACCEPTヘッダーをチェックし、ヘッダーの一致*/*;q=0.6 (数値は異なる場合があります)を common で置き換えます*/*q=0.6の後に別のメディア タイプが続かない場合は意味がないため、このヘッダーの変更はその意味を変更しないため、これはさらに優れています。私たちは Rails を特定の形式に強制することはありません。Rails が理解できる方法で実行するように指示するだけです。

この gist には、ミドルウェア、ロード初期化子、および統合テストがあります

Gem バージョンはこちら: https://github.com/ouvrages/rails_fix_google_bot_accept

于 2012-04-05T11:07:20.773 に答える
6

私も同じことをしています。調査を行った結果、Rails の「バグ」であるという結論に達しました。*/*;q=0.9HTTP Accept パラメータの値です。何が起こっているのか正確にはわかりませんが、Rails 3.0 ではこれが機能します。Rails 3.1 では 500 レスポンスを返し、Rails 3.2 では 406 レスポンスを返します。

アップデート:

この問題に関して未解決のバグがあります。1 つの回避策は、Rails 3.1 でこの新しいオプションを設定することです。

config.action_dispatch.ignore_accept_header = true

ただし... HTML 以外のページを提供する場合は、/users/1.jsonヘッダーを受け入れる代わりに、拡張機能に依存してタイプ (例: ) を示す必要があります。

于 2012-01-23T21:10:08.293 に答える
4

この問題の解決策は、アクションで形式を指定することです。

これまでは、インデックスアクションで次のことを単純に行っていました

def index

end

Respond_to ブロックを挿入したら

def index
  respond_to do |format|
    format.html
  end
end

テンプレートの欠落エラーが発生しなくなりました。

于 2012-03-14T14:48:18.143 に答える
1

あなたが投稿したエラーの興味深い部分は:formats=>["*/*;q=0.9"]

rails-app は、機能しない形式のテンプレートを見つけようとします"*/*;q=0.9"

私はグーグルがどういうわけかこれを次のようなフォーマットクエリパラメータとして使用していると思いますwelcome?format=*/*;q=0.9

これらの場合、最新のRailsバージョンは406をレンダリングするだけです。

于 2012-01-16T17:40:29.087 に答える