Перенаправление и предотвращение кеширования в Symfony2

Я делаю это:

domain.com/route-name/?do-something=1

.. который устанавливает cookie, а затем перенаправляет на него с помощью перенаправления 302:

domain.com/route-name/

Это позволяет выполнять действие независимо от просмотра страницы (cookie хранит настройки для пользователя).

Я использую кэш обратного прокси-сервера Symfony2 по умолчанию, и все хорошо, но мне нужно предотвратить кэширование обоих вышеупомянутых запросов.

Я использую это для выполнения перенаправления: я

// $event being a listener, usually a request listener

$response = new RedirectResponse($url, 302);    
$this->event->setResponse($response);

мы пробовали такие вещи, но ничего не получается:

$response->setCache(array('max_age' => 0));
header("Cache-Control: no-cache");

Так как я могу остановить это кэширование этих страниц?

Ответы на вопрос(2)

Решение Вопроса

что отправляете следующие заголовки с RedirectResponse (если задан параметр GET) И с вашим обычным ответом для маршрута:

Cache-Control: private, max-age=0, must-revalidate, no-store;

Получите то, что вы хотите, как это:

$response->setPrivate();
$response->setMaxAge(0);
$response->setSharedMaxAge(0);
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->headers->addCacheControlDirective('no-store', true);

личное важно и отсутствует в комеответ.

Разница в том, что с Cache-Control: private вы не разрешаете прокси кэшировать данные, проходящие через них.

 user214335626 мая 2013 г., 15:39
На самом деле, где вы упоминаетеИ с вашим обычным ответом на маршрут: ISN»возможно из-за того, что сервер не попал
 nifr26 мая 2013 г., 15:28
вот что я сказал вам сделать ... отправить заголовок кэша при перенаправлении (URL с get-параметром запроса) и запрос без параметра-запроса. Теперь очистите кеш вашего браузера, и браузер не будет кешировать ни то, ни другое. Браузер будет кэшировать, только если заголовок отсутствует ... поэтому убедитесь, что вы отправляете заголовок без кэширования с каждым из двух ответов.
 user214335626 мая 2013 г., 15:53
Я неЯ не понимаю ничего из этого, но да, он не попадает на сервер. Первый ответ попадает на сервер и возвращает совершенно новый ответ (302). Второй запрос возвращается из кеша браузера.
 user214335627 мая 2013 г., 03:34
сдался, но спасибо за помощь
 nifr26 мая 2013 г., 01:59
Ваша проблема теперь решена моим ответом? или я должен что-то добавить? в противном случае, пожалуйста, примите ответ :)
 nifr25 мая 2013 г., 22:07
домен.com/route-name / В маршруте также должны быть отправлены заголовки управления кэшем. Вы отправляете их со своим ответом-редиректом И с вашим маршрутом?
 user214335625 мая 2013 г., 21:52
Спасибо за помощь. Оба ответа очень похожи, и оба имеют одинаковый результат. Это прекрасно работает при кэшировании первого URL-адреса (со строкой запроса), но когда он затем перенаправляет на последний URL-адрес (часть domain.com/route-name/), который все еще кэшируется. Это'Как будто кеширующие заголовки должны быть переданы на перенаправленную страницу или что-то в этом роде.
 user214335625 мая 2013 г., 22:24
Мы в основном добавили ваш код между двумя строками, которые я перечислил выше. Я'мы также смотрели наapi.symfony.com/2.0/Symfony/Component/HttpFoundation/... но может'не вижу, что еще можно сделать.
 user214335626 мая 2013 г., 01:59
Все еще пытаюсь решить это. Благодарю. Пока ям установив заголовки кэша на 2-й запрос, он все еще выигралt очистить кеш.
 nifr25 мая 2013 г., 22:44
вам нужны настройки управления кешем ДВАЖДЫ в вашем действии контроллера ... один раз для ответа на перенаправление и один раз для вашего обычного ответа (когда перенаправление не происходит). Вы включили их обоих? Я обновил ответ соответственно.
 nifr26 мая 2013 г., 02:00
где ты сдаешь? Вы пытались сохранить параметр в сеансе, чтобы решить, отправлять ли заголовки или нет?
 user214335625 мая 2013 г., 23:48
Спасибо, теперь я понял. Проблема яу меня есть второй / последний запрос, обнаруживающий, был ли он от перенаправления. Я могу'ничего не вижу вapi.symfony.com/2.0/Symfony/Component/HttpFoundation/... который сказал бы мне это. Очевидно, мне нужно что-то, чтобы отделить его от обычного запроса, инициированного пользователем. Возвращает 200 кодов состояния
 user214335626 мая 2013 г., 02:16
Получил в конце. Проблема с обнаружением и очисткой сеанса, но все отсортировано. Любая идея об этом:stackoverflow.com/questions/16753279/...I»
 nifr25 мая 2013 г., 23:54
ах хорошо, вы хотите кешировать, но только в случае, если из-за перенаправления запретить кеширование? затем сохраните параметр в своем сеансе и, если он есть, удалите его и выведите заголовки без кэширования!
 nifr26 мая 2013 г., 15:50
как это не может быть попадание на сервер? пользователь запрашивает url? p = bar ... запрос достигает symfony ... symfony отвечает: DONT CACHE, но, пожалуйста, перенаправьте моего пользователя на url / please (статус 301 и заголовок no-cache) ... браузер похож на 'хорошо я выигралт кеш ' ... и запрашивает URL / ... запрашивает хиты symfony ОПЯТЬ ... symfony отправляет DONT CACHE (http 200, no-cache) ... ОПЯТЬ ... браузер похож на 'Хорошо, я не буду кешировать, что либо ... и это то, что вы хотели ...
 Petter Kjelkenes06 нояб. 2018 г., 16:12
setSharedMaxAge устанавливает ответ публике. Не использоватьsetSharedMaxAge если вы хотите личный ответ.
 user214335626 мая 2013 г., 15:18
я не принял ответ какне совсем верно. Проблема в том, что второй запрос недаже не попал на сервербраузер, которыйкеширую. Так или иначе, я должен остановить браузер от использования его кэша (без добавления параметра запроса).
 BrynJ25 июл. 2016 г., 15:43
Я обнаружил, что еслиsetSharedMaxAge() установлен, кеш-контроль игнорируетsetPrivate() директива - заголовки по-прежнему возвращаются публике. Если вы думаете о целиs-maxage директива, это имеет смысл.
 nifr26 мая 2013 г., 16:00
предоставьте скриншот ваших сетевых запросов и заголовков firebug / dev tools, пожалуйста. нажмите на страницу два раза (кеш очищался раньше) ...? pfoo, /,? p = foo, / ... I '
 user214335626 мая 2013 г., 15:38
Нет проблем с очисткой кеша браузера. Тот'все разобрались (заверили, что все вместе). Проблема в том, чтобы установить сеанс и затем определить установленный сеанс. Обнаружение установленного сеанса неЭто невозможно, потому что второй запрос нене попал на сервер. Вы'правильно сказать, что устанавливает заголовки по второму запросу, но можетэто может быть сделано путем обнаружения установленного сеанса. Это должно быть сделано одновременно с заголовком (Location: URL); Вызов PHP.

$response->headers->addCacheControlDirective('no-cache', true);
$response->headers->addCacheControlDirective('max-age', 0);
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->headers->addCacheControlDirective('no-store', true);

Вы также можете использовать аннотации:

http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/cache.html

И взгляните на:

Почему в ответе HTTP должны использоваться как no-cache, так и no-store?

 user214335625 мая 2013 г., 21:52
Спасибо за помощь. Этот и другой ответ очень похожи и спасибо. Пожалуйста, смотрите другой ответ для комментария, как этоне совсем то, что мне нужно. Спасибо,

Ваш ответ на вопрос