2011-04-05 10 views
15

अपनी परियोजनाओं मैं हर अब और फिर यह अपवाद हो रही है में से एक के लिए:गुम टेम्पलेट ब्लॉग/रूबी पर सूचकांक

ActionView :: MissingTemplate: लापता टेम्पलेट ब्लॉग/साथ {सूचकांक: संचालकों = > [: आरएक्सएमएल,: एआरबी,: बिल्डर,: आरजेएस,: हैमल,: आरटीएमएल],: प्रारूप => ["छवि/जेपीईजी", "छवि/पीजेपीईजी", "छवि/पीएनजी", "छवि/जीआईएफ"] ,: भाषा => [: en, द]} दृश्य पथ में "/ var/www/keeponposting/विज्ञप्ति/20110403083651/ऐप्स/दृश्य"

यह कोई एक URL कि isn से एक छवि अनुरोध कर रहा है लगता है एक छवि नहीं:

HTTP_ACCEPT "image/jpeg, छवि/pjpeg, छवि/png, छवि/gif"

कोई भी विचार क्या इसके बारे में क्या करने के लिए

? क्या मुझे उनमें से किसी एक के लिए एक हैंडलर लागू करना है और इस अपवाद से छुटकारा पाने के लिए "" वापस करना है या इसे संभालने का एक बेहतर तरीका है?

ActionView :: MissingTemplate: प्रारूपों => [ "पाठ/*"],: संचालकों => [: लापता टेम्पलेट ब्लॉग/साथ {इंडेक्स

अब मैं भी इस हो रही है रेडियो जॉकी, : haml,: rhtml,: erb,: rxml,: builder], locale => [: en,: en]} पथों को देखने में "/ var/www/keeponposting/रिलीज/20110415040109/ऐप/विचार"

क्या HTML को वापस भेजने का कोई तरीका नहीं है इससे कोई फर्क नहीं पड़ता कि प्रारूप किस प्रकार से अनुरोध किया गया है?

उत्तर

8

मैं कुछ मिनट पहले इस मुद्दे (फिक्स्ड - तो तक का सबसे अच्छा) इस नए रेल 3.1 विकल्प के साथ:

config.action_dispatch.ignore_accept_header = true 

this Rails issue में उल्लेख किया है। यह config/application.rb में जाता है।

मैं एक RSpec अनुरोध परीक्षण (Capybara का उपयोग) में ऐसा है जैसे कि यह परीक्षण किया:

it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do 
    page.driver.header "Accept", "image/*;w=320;h=420" 
    visit "/some/path" 
    page.should have_content("Some content") 
end 
+0

यह अच्छा है, लेकिन क्या वहां कोई अच्छा ब्राउज़र है, या यह एक हमला या हैक प्रयास या डॉस या बॉट है? –

5

मैं आपके एप्लिकेशन नियंत्रक में MissingTemplate को सहेजने का प्रयास करता हूं और यह अनुरोध देखने के लिए रेफरर हेडर लॉग करता हूं कि यह अनुरोध किस प्रकार ट्रिगर कर रहा है। आप कभी नहीं जानते, यह आपके अपने ऐप का कुछ अस्पष्ट हिस्सा हो सकता है!

यदि दूसरी ओर आपको विश्वास है कि यह रोबोट के कारण होता है, तो क्या आपने अपने robots.txt फ़ाइल में अपमानजनक यूआरएल जोड़ने पर विचार किया है? उदाहरण के लिए:

User-Agent: YandexImages 
Disallow: /your/failed/path 

जिस रोबोट पर ठोकर खा रहा है, उसके साथ 'आपका/असफल/पथ' बदलना। रोबोट हर जगह संघर्ष कर रहा है, तो आप केवल उस विशेष रोबोट के लिए पूरी साइट के लिए उपयोग की अनुमति नहीं देने सकता है:

User-Agent: YandexImages 
Disallow:/

मुझे लगता है कि यह एक क्लीनर और विशेष रूप से एक हैंडलर को लागू करने के लिए एक से त्रुटियों को दबाने के लिए की तुलना में हल्का दृष्टिकोण है प्रतीत होता है बुरी तरह से व्यवहार किया गया बॉट।

+0

मुझे लगता है कि के बारे में सोचा है, लेकिन भेक की रिपोर्ट में अपवाद में मैं आम तौर पर संदर्भ देने वाली और इस बार यह वहाँ नहीं था मिलता है, तो मैं वहाँ से कोई भी है अनुमान। उपयोगकर्ता एजेंट मोज़िला/5.0 (संगत; यांडेक्स इमेज/3.0; + http: //yandex.com/bots) है, इसलिए मुझे लगता है कि यह एक खोया छोटा रोबोट है। – Pablo

+0

प्रश्न के लिए संभवतः इस जानकारी को जोड़ने के लायक (वास्तविक पथों के साथ)? मैंने robots.txt –

+0

का उपयोग कर प्रश्न में क्षेत्रों से रोबोट को छोड़कर सुझाव देने का सुझाव संपादित किया है, खोए हुए छोटे रोबोट को अवरुद्ध करने से यह छोटी त्रुटि हो सकती है। प्रतिक्रिया प्रकार को मजबूर करने के लिए रेल ऐप के साथ क्या किया जा सकता है? – TelegramSam

13

मैं हमलावर रोबोट अवरुद्ध करने के बारे सहमत हैं, लेकिन प्रतिक्रिया स्वरूप एक before_filter और request.format = :html निर्धारित करते हैं, जोड़ने के इस तरह यदि आप वास्तव में बाध्य करना चाहते हैं:

before_filter :force_request_format_to_html 

private 

def force_request_format_to_html 
    request.format = :html 
end 
+1

बेशक, यह केवल तभी काम करता है जब आपका एप्लिकेशन अन्य प्रारूपों को स्वीकार नहीं करता है! कोई JSON या XML नहीं, जो सामान्य प्रारूप हैं। – ipd

+1

मेरे मामले में, googlebot एक खोज परिणाम पृष्ठ पर हमला कर रहा था, जो कुछ हम चाहते थे, लेकिन एक प्रारूप बिल्कुल सेट नहीं हो रहा था। हमारी खोज कार्रवाई जेसन अनुरोधों की भी अनुमति देती है, इसलिए मजबूर करना: एचटीएमएल काम नहीं करेगा। लेकिन एक साधारण स्थिति करता है: 'अगर अनुरोध [: प्रारूप] .blank? request.format =: एचटीएमएल अंत ' –

6

यहाँ एक सख्त प्रतिक्रिया है; issue 4127 पर चर्चा से, purp द्वारा एक सुझाव।

class FooController 
    rescue_from ActionView::MissingTemplate, :with => :missing_template 

    def missing_template 
    render :nothing => true, :status => 406 
    end 
end 
0

मैं ऐसा किया: मेरी नियंत्रक में, मैं एक से पहले फिल्टर डाल:

def acceptable_mime_type 
    unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil) 
    if request.accepts.detect{|a| a.to_s().include?("*/*")} 
     ActionDispatch::Request.ignore_accept_header = true 
    else 
     render text: "Unacceptable", status: 406 
     false 
    end 
    end 
end 

मेरी समर्थित प्रकार के लिए यह जाँच करता है (उदाहरण के लिए json, एचटीएमएल) और शून्य (शून्य डिफ़ॉल्ट HTML renders), तो यदि उन माइम प्रकार समर्थित नहीं हैं, तो यह शीर्षलेख में "/" की जांच करता है। अगर इसे पाता है, तो मैं स्वीकृति हेडर को अनदेखा करके डिफ़ॉल्ट माइम प्रकार को प्रस्तुत करने के लिए रेल को मजबूर करता हूं।

rspec में इस परीक्षण के लिए, मैं यह करने के लिए किया था: किसी कारण से

describe 'bad header' do 
    describe 'accept' do 
    let(:mimeTypes) { ["application/text, application/octet-stream"] } 

    it 'should return a 406 status code' do 
     request.accept = mimeTypes 
     get 'index' 
     expect(response.response_code).to eq 406 
    end 

    describe 'with */* included' do 
     it 'should return a 200 status code' do 
     request.accept = ["*/*"] + mimeTypes 
     get 'index' 
     expect(response.response_code).to eq 200 
     end 
    end 
    end 
end 

, मैं का उपयोग कर तरीकों वर्णित here rspec में ठीक से हेडर को स्वीकार भेजने की कोशिश कर समस्याओं हो रही थी, लेकिन मैं अगर मैंने पाया अनुरोध करें। एक ऐरे को स्वीकार करें, मेरे दोनों परीक्षण पास हुए। अजीब, मुझे पता है, लेकिन मैं अब के लिए अगले मुद्दे पर जा रहा हूँ।

0

जोड़े formats: [:html] रेंडर करने के लिए:

def action 
    render formats: [:html] 
end 
संबंधित मुद्दे