2012-01-16 12 views
19

Negli ultimi due giorni, abbiamo iniziato a ricevere un errore modello mancante quando il bot di Google tenta di accedere alla nostra home page principale (benvenuto/indice). Sono stato a guardare questo per un paio d'ore e so che mi manca solo qualcosa di semplice.Googlebot riceve errore modello mancante per un modello esistente

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]} 

Ma il modello esiste (index.html.haml). Se no, nessuno poteva accedere alla nostra home page.

Ecco alcune informazioni aggiuntive ambiente:

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

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

Tutte le comprensioni avete sarebbe molto apprezzato.

+1

Hai provato "Visualizza come Googlebot" su Google Webmaster Tools per vedere se si ottiene un errore di più chiaro? http://support.google.com/webmasters/bin/answer.py?hl=it&answer=158587 –

+0

Buon suggerimento. Ho appena fatto e è tornato successo. Tuttavia, non riesco a dire a google di usare https, che è il protocollo in cui si verifica l'errore. – TDH

+0

Stranamente, hai controllato, anche in Diagnosi, nell'area di scansione per verificare se tu se Google sta segnalando qualcosa lì? Forse sta passando alcuni parametri. –

risposta

4

La soluzione al problema è specificare il formato nell'azione.

Fino ad ora, avevo avuto semplicemente il seguente nella mia azione index

def index 

end 

Una volta ho inserito un blocco respond_to

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

ho smesso di ottenere gli errori del modello mancanti.

+1

L'aggiunta di questo codice consente alla mia app di rispondere con un errore "HTTP/1.1 406 non accettabile". Non so se questo è quello che voglio ancora. (Sotto Rails 3.0.12) – rchampourlier

1

la parte interessante l'errore che hai postato è :formats=>["*/*;q=0.9"]

rotaie-app cerca di trovare un modello per il formato "*/*;q=0.9" che non sta andando a lavorare.

Immagino che Google è in qualche modo usando questo come parametro di query formato simile welcome?format=*/*;q=0.9

afaik ultime versioni rotaie sarà solo rendere un 406 in quei casi.

+0

Non è quello che proviene dall'intestazione di accettazione, dicendo che accetterà qualsiasi tipo di file? – TDH

+0

Penso che in qualche modo debba essere interpretato come un formato dall'applicazione rails. altrimenti non c'è motivo per cui genera un errore su questo argomento. – phoet

+0

È possibile rappresentarlo localmente: rails s -e produzione e scrittura in altro terminale: curl -v -H "Accetta: /; q = 0.9" 127.0.0.1:3000 – Alexey

6

Anche io sto ottenendo lo stesso, ho fatto alcune indagini e sono giunto alla conclusione che si tratta di un "bug" in Rails. */*;q=0.9 è il valore del parametro HTTP accept. Non sono esattamente sicuro di cosa stia succedendo, ma in Rails 3.0 funziona. In Rails 3.1 restituisce una risposta 500 e in Rails 3.2 restituisce una risposta 406.

Aggiornamento:

C'è un open bug riguardo a questo problema. Una soluzione è quella di impostare questa nuova opzione in Rails 3.1:

config.action_dispatch.ignore_accept_header = true 

Tuttavia ... se vi servono le pagine diverse da HTML è necessario fare affidamento su l'estensione per indicare il tipo (ad es /users/1.json) al posto di accetta intestazioni.

+0

Grazie per l'aggiornamento. Sto facendo funzionare 3.0.7. Quindi questo potrebbe non essere applicabile al mio caso. – TDH

16

Questi errori provengono dal modo in cui GoogleBot formatta l'intestazione HTTP_ACCEPT. Se valido (see W3 reference), aggiunge q=0.6(l'ultima cifra può cambiare) che viene utilizzato come separatore. Poiché non è specificato alcun altro tipo di supporto, questo q=0.6 non è necessario e presumo che questo è il motivo per cui Rails non tratta correttamente l'intestazione.

(Sembra dipendere dalla versione di Rails. Su Rails 3.0,12, si solleva un'eccezione MissingTemplate)

Aggiungendo il codice da una precedente risposta al controllore in questione non è sufficiente. Risponde con un errore 406.

respond_to do |format| 
    format.html 
end 

per fare questo lavoro sotto Rails 3.0.12 e hanno qualcosa restituito al GoogleBot (meglio di un errore di 406), è necessario aggiungere il codice che definisce il formato del richiesta di html più presto un */*;q=0.6 -come viene rilevato HTTP_ACCEPT (i binari caricano il valore dell'intestazione in request.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 

Mentre si lavora, questa soluzione ha bisogno il codice da aggiungere a qualsiasi azione di controllo che si desidera essere indicizzato da Googlebot, ciò che è in realtà non a secco!

Per risolvere questo problema una volta per tutte, ho implementato un piccolo middleware rack che fa ancora meglio: controlla HTTP_ACCEPT intestazione della richiesta, e sostituirà qualsiasi intestazione corrispondenza */*;q=0.6(le cifre possono variare) dal comune */*. Questo è ancora meglio perché poiché lo q=0.6 non ha significato se non è seguito da un altro tipo di media, questa modifica dell'intestazione non cambia il suo significato. Non forziamo Rails in nessun formato dato, diciamo solo che qualsiasi cosa farà in un modo che può capire.

È possibile trovare il middleware, l'inizializzatore di caricamento e un test di integrazione in questo gist.

versione Gem qui: https://github.com/ouvrages/rails_fix_google_bot_accept

+0

Grazie, questa è un'ottima soluzione. Questo è molto meglio di un '406'. –

+0

Soluzione sorprendente. Ottimo lavoro. Hai fatto un servizio. –

+1

Ho creato un gioiello basato sul tuo succo: https://github.com/ouvrages/rails_fix_google_bot_accept –