Рельсы несвежие?метод для sitemap всегда возвращает HTTP 200

StackOverflow https://stackoverflow.com/questions/744353

  •  09-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

HTTP позволяет клиенту указывать время условие для документа, который он запрашивает.Это If-Модифицированный-Since или If-Неизмененный-Since.Curl позволяет вам указывать их с помощью флага -z/--time-cond .

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

завиток -z local.html http://remote.server.com/remote.html

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

завиток -z -local.html http://remote.server.com/remote.html

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top