Согласование содержимого игнорируется при использовании кнопки Возврата браузера
-
13-09-2019 - |
Вопрос
Вот такая ситуация:
У меня есть веб-приложение, которое отвечает на запрос списка ресурсов, скажем:
/items
Первоначально это запрашивается непосредственно веб-браузером путем перехода по этому пути.Браузер использует стандартный заголовок "Accept", который включает "text / html", и мое приложение замечает это и возвращает HTML-содержимое для списка элементов.
Внутри возвращаемого HTML находится некоторый JavaScript (jQuery), который затем выполняет ajax-запрос для извлечения фактических данных:
/items
Только на этот раз заголовку "Accept" явно присвоено значение "application/json".Опять же, мое приложение замечает это, и JSON корректно возвращается в запрос, данные вставляются на страницу, и все устраивает.
Вот тут-то и возникает проблема:Пользователь переходит на другую страницу, а затем нажимает кнопку "НАЗАД".Затем им будет предложено сохранить файл.Это, оказывается, тот самый JSON данные из списка товаров.
Пока что я подтвердил, что это происходит как в Google Chrome, так и в Firefox 3.5.
Здесь есть два возможных типа ответов:
Как я могу исправить эту проблему?Есть ли какая-то волшебная комбинация Заголовков Cache-Control или других voodoo, которые заставляют браузер делать правильные вещи здесь?
Если вы думаете, что я делаю что-то здесь ужасно неправильно, как мне поступить по этому поводу?Я стремлюсь к корректности, но также пытаюсь не жертвовать гибкостью.
Если это поможет, приложение представляет собой веб-приложение JAX-RS, использующее Restlet 2.0 m4.Я могу предоставить примеры заголовков запросов / ответов, если это полезно, но я считаю, что проблема полностью воспроизводима.
Решение
Есть ли какая-то волшебная комбинация заголовков Cache-Control или другого вуду, которые заставляют браузер поступать здесь правильно?
Если вы отправляете разные ответы на разные запросы, примите:заголовки, вы должны включить заголовок:
Vary: Accept
в вашем ответе.В Варьироваться заголовок также должен содержать любые другие заголовки запроса, которые влияют на ответ, так что, например, если вы выполняете сжатие gzip / deflate, вам придется включить Accept-Encoding .
IE, к сожалению, обрабатывает много значений Vary
плохо, полностью нарушая кэширование, что может иметь для вас значение, а может и не иметь.
Если вы считаете, что я делаю здесь что-то ужасно неправильное, как мне следует поступить по этому поводу?
Я не думаю, что идея предоставления разного контента для разных типов по одному и тому же URL-адресу ужасно ошибочна, но вы позволяете себе больше проблем с совместимостью, чем вам действительно нужно.Полагаться на заголовки, работающие через JSON, на практике не очень хорошая идея;вам было бы лучше всего просто указать другой URL, например /items/json
или /items?format=json
.
Другие советы
Я знаю, что этот вопрос устарел, но на всякий случай, если кто-нибудь еще столкнется с этим:
У меня была такая же проблема с приложением Rails, использующим jQuery, и я исправил ее, указав браузеру не кэшировать ответ JSON с решением, приведенным здесь для другого вопроса:
Казалось, проблема возникла только с Chrome и Firefox.Safari нормально справлялся с обратным поведением, не требуя явно указывать ему не кэшировать.
Старый вопрос, но для всех, кто еще видит это, нет ничего плохого в том, что спрашивающий использует заголовок Accept .
Это подтвержденная ошибка в Chrome.(Ранее также в Firefox, но с тех пор исправлено.)