2012-01-16 29 views
19

Trong vài ngày qua, chúng tôi đã bắt đầu nhận được lỗi mẫu bị thiếu khi bot google cố gắng truy cập vào trang chủ chính của chúng tôi (chào mừng/chỉ mục). Tôi đã nhìn chằm chằm vào điều này trong một vài giờ và biết rằng tôi chỉ thiếu một cái gì đó đơn giản.Googlebot nhận lỗi mẫu bị thiếu cho mẫu hiện tại

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

Nhưng mẫu không tồn tại (index.html.haml). Nếu không ai có thể truy cập trang chủ của chúng tôi.

Dưới đây là một số thông tin môi trường bổ sung:

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

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

Bất kỳ hiểu biết bạn có sẽ được đánh giá rất nhiều.

+1

bạn đã cố gắng "Tìm nạp như Googlebot" trên Google Webmaster Tools để xem nếu bạn nhận được một lỗi rõ ràng hơn? http://support.google.com/webmasters/bin/answer.py?hl=vi&answer=158587 –

+0

Đề xuất tốt. Tôi vừa làm và nó trở lại thành công. Tuy nhiên, tôi dường như không thể yêu cầu google sử dụng https, đây là giao thức mà lỗi xảy ra. – TDH

+0

Lạ lùng, bạn đã kiểm tra, cũng có trong Chẩn đoán, trong vùng lỗi thu thập thông tin để xem liệu bạn có đang báo cáo bất kỳ điều gì ở đó không? Có lẽ nó đi qua một số thông số. –

Trả lời

4

Giải pháp cho vấn đề là chỉ định định dạng trong hành động của bạn.

Cho đến bây giờ, tôi đã chỉ đơn giản là có sau trong action index của tôi

def index 

end 

Khi tôi chèn một khối respond_to

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

tôi dừng lại nhận được lỗi mẫu mất tích.

+1

Thêm mã này làm cho ứng dụng của tôi phản hồi với lỗi 'HTTP/1.1 406 Không thể chấp nhận'. Tôi không biết đây có phải là điều tôi muốn hay không. (Theo Rails 3.0.12) – rchampourlier

1

phần thú vị trong các lỗi mà bạn đăng là :formats=>["*/*;q=0.9"]

đường ray ứng dụng cố gắng tìm một khuôn mẫu để định dạng "*/*;q=0.9" mà không được đi làm.

tôi đoán rằng Google là bằng cách nào đó sử dụng điều này như một tham số truy vấn dạng như welcome?format=*/*;q=0.9

afaik phiên bản ray mới nhất sẽ chỉ làm cho một 406 trong những trường hợp.

+0

Đó không phải là từ tiêu đề chấp nhận, nói rằng nó sẽ chấp nhận bất kỳ loại tập tin? – TDH

+0

tôi nghĩ rằng nó bằng cách nào đó phải được giải thích như là một định dạng của ứng dụng đường ray của bạn. nếu không không có lý do tại sao nó ném một lỗi về chủ đề này. – phoet

+0

Bạn có thể đại diện cho nó tại địa phương: đường ray s -e sản xuất và viết trong thiết bị đầu cuối khác: curl -v -H "Chấp nhận: /; q = 0.9" 127.0.0.1:3000 – Alexey

6

Tôi cũng nhận được như vậy, tôi đã thực hiện một số điều tra và đi đến kết luận đó là một 'lỗi' trong Rails. */*;q=0.9 là giá trị của thông số chấp nhận HTTP. Tôi không chắc chắn những gì đang xảy ra, nhưng trong Rails 3.0, nó hoạt động. Trong Rails 3.1, nó trả về một đáp ứng 500 và trong Rails 3.2 nó trả về một phản hồi 406.

Cập nhật:

Có một open bug về vấn đề này. Một cách giải quyết là để thiết lập tùy chọn mới này trong Rails 3.1:

config.action_dispatch.ignore_accept_header = true 

Tuy nhiên ... nếu bạn phục vụ bất kỳ trang nào khác hơn là HTML bạn sẽ cần phải dựa vào phần mở rộng để chỉ các loại (ví dụ /users/1.json) thay vì chấp nhận tiêu đề.

+0

Cảm ơn bạn đã cập nhật. Tôi đang chạy 3.0.7. Vì vậy, điều này có thể không áp dụng cho trường hợp của tôi. – TDH

16

Các lỗi này đến từ cách GoogleBot định dạng HTTP_ACCEPT tiêu đề. Trong khi hợp lệ (see W3 reference), nó thêm q=0.6(hình cuối cùng có thể thay đổi) được sử dụng làm dấu tách. Vì không có loại phương tiện nào khác được chỉ định, nên không cần thiết q=0.6 và tôi giả định đây là lý do tại sao Rails không xử lý chính xác tiêu đề.

(Dường như phụ thuộc vào phiên bản Rails. Trên Rails 3.0,12, nó nêu ra một ngoại lệ MissingTemplate.)

Thêm mã sau đây từ câu trả lời trước cho bộ điều khiển liên quan là không đủ: nó trả lời lỗi 406.

respond_to do |format| 
    format.html 
end 

Để làm công việc này dưới Rails 3.0.12 và đã một cái gì đó trở lại GoogleBot (tốt hơn so với một lỗi 406), bạn cần phải thêm mã này mà bộ dạng của request để html càng sớm một */*;q=0.6 -like HTTP_ACCEPT được phát hiện (Đường ray tải giá trị tiêu đề vào 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 

Trong khi làm việc, giải pháp này cần mã được thêm vào bất kỳ hành động điều khiển bạn muốn được lập chỉ mục bởi các GoogleBot, những gì đang thực sự không khô!

Để khắc phục vấn đề này một lần cho tất cả, tôi thực hiện một middleware Kệ nhỏ mà làm thậm chí tốt hơn: nó kiểm tra HTTP_ACCEPT header của request, và sẽ thay thế bất kỳ tiêu đề phù hợp với */*;q=0.6(các con số có thể thay đổi) bởi phổ biến */*. Điều này thậm chí còn tốt hơn vì vì q=0.6 không có ý nghĩa nếu nó không được theo sau bởi một loại phương tiện khác, thay đổi của tiêu đề này không thay đổi ý nghĩa của nó. Chúng tôi không ép buộc Rails vào bất kỳ định dạng cụ thể nào, chúng tôi chỉ nói với bất kỳ định dạng nào theo cách mà nó có thể hiểu được.

Bạn có thể tìm phần mềm trung gian, trình khởi chạy tải và kiểm tra tích hợp trong gist này.

Gem phiên bản ở đây: https://github.com/ouvrages/rails_fix_google_bot_accept

+0

Cảm ơn, đây là một giải pháp tuyệt vời. Điều này tốt hơn nhiều so với '406'. –

+0

Giải pháp tuyệt vời. Người đàn ông tuyệt vời. Bạn đã thực hiện một dịch vụ. –

+1

Tôi đã tạo một viên ngọc dựa trên ý chính của bạn: https://github.com/ouvrages/rails_fix_google_bot_accept –

Các vấn đề liên quan