2009-04-13 14 views
5

Мои Рубин на Rails приложение использует следующий код контроллера для генерации sitemap.xml файла:Rails 'stale? Метод сайта всегда возвращает HTTP 200

class SitemapController < ApplicationController 
    layout nil 

    def index 
    headers['Content-Type'] = 'application/xml' 
    last_post = Post.last 
    if stale?(:etag => last_post, :last_modified => last_post.updated_at.utc) 
     respond_to do |format| 
     format.xml { @posts = Post.sitemap } # sitemap is a named scope 
     end 
    end 
    end 
end 

Я понимаю, что метод stale? должен обеспечить HTTP 304 Not Modified, если ответ содержимое не изменилось. Тем не менее, всякий раз, когда я проверить это с помощью завиток или веб-браузер, я всегда получаю HTTP 200:

 
$ curl --head localhost:3000/sitemap.xml 
HTTP/1.1 200 OK 
Connection: close 
Date: Mon, 13 Apr 2009 15:50:00 GMT 
Last-Modified: Wed, 08 Apr 2009 16:52:07 GMT 
X-Runtime: 100 
ETag: "5ff2ed60ddcdecf291e7191e1ad540f6" 
Cache-Control: private, max-age=0, must-revalidate 
Content-Type: application/xml; charset=utf-8 
Content-Length: 29318 

я использую метод stale? правильно? Можно ли даже проверить это локально?

ответ

4

вполне вероятно, что ваш код Rails просто прекрасен, но curl не отправляет заголовок If-Modified-Since при выполнении вашего теста. Из curl docs:

ВРЕМЕНИ УСЛОВИЙ

HTTP позволяет клиенту указать условие времени для документа он запросов. Это If-Modified-Since или If-Unmodified-Since. Curl позволяет вам указать их с -z/- time-cond flag.

Например, вы можете легко сделать загрузку, только получает выполняется, если удаленный файл новее, чем локальный копии. Это будет сделано, как:

локон -z local.html http://remote.server.com/remote.html

Или вы можете загрузить файл, только если локальный файл новее, чем удаленного один. Сделайте это, предваряя строку даты с «-», как:

локон -z -local.html http://remote.server.com/remote.html

Вы можете указать «свободный текст» дату как состояния. Скажите завиток, чтобы загрузить только файл, если он был обновлен, поскольку вчера:

Curl -z вчера http://remote.server.com/remote.html

Curl будет принимать широкий спектр форматов даты. Вы всегда делаете дату проверьте наоборот: добавив ее с тире '-'.

+0

Спасибо Адам, вот и все. –

+0

Отлично, я надеялся, что это будет полезно для вас. Спасибо за обновление! –