Рельсы несвежие? метод для карты сайта всегда возвращает HTTP 200 - PullRequest
5 голосов
/ 13 апреля 2009

Приложение My Ruby on Rails использует следующий код контроллера для создания файла sitemap.xml:

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, если содержимое не изменилось. Однако всякий раз, когда я проверяю это с помощью curl или веб-браузера, я всегда получаю 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?? Можно ли даже проверить это локально?

1 Ответ

4 голосов
/ 14 апреля 2009

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

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

HTTP позволяет клиенту указывать время условие для документа это Запросы. Это если модифицирован-с или Если-Unmodified-С. Скручиваемость позволяет укажите их с помощью -z / - time-cond флаг.

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

curl -z local.html http://remote.server.com/remote.html

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

curl -z -local.html http://remote.server.com/remote.html

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

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

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

...