Как заставить диспетчер кэшировать URL-адреса с параметрами get

Как я понял прочитав эти ссылки:

Как узнать, что кэширует диспетчер?

http://docs.adobe.com/docs/en/dispatcher.html

The Dispatcher always requests the document directly from the AEM instance in the following cases:

If the HTTP method is not GET. Other common methods are POST for form data and HEAD for the HTTP header.
If the request URI contains a question mark "?". This usually indicates a dynamic page, such as a search result, which does not need to be cached.
The file extension is missing. The web server needs the extension to determine the document type (the MIME-type).
The authentication header is set (this can be configured)

Но я хочу кэшировать URL с параметрами.

Если я однажды попрошу myUrl/?p1=1&p2=2&p3=3

затем следующий запрос к myUrl/?p1=1&p2=2&p3=3 должен обслуживаться из кеша диспетчера, но myUrl/?p1=1&p2=2&p3=3&newParam=newValue должен обслуживаться CQ в первый раз и из кеша диспетчера для последующих запросов.


person gstackoverflow    schedule 04.12.2014    source источник


Ответы (3)


Я думаю, что конфигурация /ignoreUrlParams - это то, что вы ищете. Его можно использовать для белого списка параметров запроса, которые используются для определения того, кэшируется ли страница/доставляется из кеша или нет.

Проверьте http://docs.adobe.com/docs/en/dispatcher/disp-config.html#Ignoring%20URL%20Parameters для получения подробной информации.

person Markus Haack    schedule 12.01.2015
comment
Я думаю, что в этом случае для site.com/page?q=1 и site.com/page?q=2 диспетчер возвращает одинаковое значение - person gstackoverflow; 12.01.2015

Невозможно кэшировать запросы, содержащие строку запроса. Такие вызовы считаются динамическими, поэтому не следует ожидать их кэширования.

С другой стороны, если вы уверены, что такой запрос должен кэшироваться, потому что ваше приложение/функция управляется запросом, вы можете работать с ним таким образом.

  1. Добавьте правило перезаписи Apache, которое будет перемещать строку запроса данного параметра в селектор.
  2. (необязательно) Добавьте фильтр CQ, который распознает селектор и вернет его в строку запроса.

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

person Mateusz Chromiński    schedule 04.12.2014
comment
не могли бы вы привести пример? - person gstackoverflow; 04.12.2014
comment
Я думаю, что суффикс был бы лучшим выбором. - person Tomek Rękawek; 04.12.2014
comment
@Tomek Rękawek, можете ли вы предоставить более подробную информацию? если я изменю URL-адрес, то этот URL-адрес будет запрашивать другой ресурс. Можете ли вы объяснить, как решить эту проблему? - person gstackoverflow; 04.12.2014
comment
forums.adobe.com/message/4930557#4930557 Актуальна ли эта тема для меня? - person gstackoverflow; 04.12.2014
comment
будет ли myurl.jsp/parameter/values кэшироваться в диспетчере? - person gstackoverflow; 05.12.2014
comment
Такие вызовы считаются динамическими, поэтому не следует ожидать их кэширования. Совершенно справедливо ожидать, что можно будет кэшировать запросы с параметрами запроса — браузеры, CDN, пограничные кэши прекрасно справляются с этим. Я предполагаю, что фактическая причина заключается в том, что кэширование диспетчера основано только на статических файлах на диске, и делать параметры запроса частью имени файла на диске неудобно. По той же причине он не может кэшировать заголовки ответов. - person Adrian Baker; 06.03.2017
comment
Вы правы, есть способы кеширования динамических данных, и они также существуют в мире AEM. Я не согласен, что основной причиной того, что диспетчер не кэширует параметры запроса, является техническое ограничение статического именования файлов. Параметры запроса сильно перегружены в веб-мире. Я считаю, что это рациональное решение не кэшировать параметры запроса, чтобы обеспечить (или даже обеспечить) лучшую архитектуру приложения, то есть более соответствующую принципам Apache Sling. Согласно заголовкам - начиная с диспетчера 4.1.11 это действительно возможно. См. cognifide.com/our-blogs/cq/aem-dispatcher. -новые-функции - person Mateusz Chromiński; 15.03.2017

Вы можете сделать это с перезаписью Apache, НО это не будет идеальной практикой. Вы сломаете шаблон, который использует AEM.

Вместо этого используйте селекторы и расширения. Например. вместо server.com/mypage.html?somevalue=true используйте: server.com/mypage.myvalue-true.html

Большинство вещей, которые вам нужно будет сделать, которые когда-либо попадут в кэш, будут работать таким образом просто отлично. Если вы дадите мне более подробную информацию о ваших требованиях и о том, чего вы пытаетесь достичь, я могу помочь вам усовершенствовать решение.

person Brenn    schedule 05.12.2014
comment
будет ли myurl.jsp/parameter/values кэшироваться в диспетчере? - person gstackoverflow; 05.12.2014
comment
да. предоставил две вещи: вы не добавляете строку запроса И вы всегда нажимаете этот путь с запросом GET. Диспетчер не кэширует вещи, которые имеют строку запроса (как вы использовали раньше) или что-либо, что не является GET, поэтому запросы POST, запросы HEAD и т. д. перенаправляются в CQ/AEM. - person Brenn; 05.12.2014
comment
@gstackoverflow Я только что видел myurl.jsp - это неправильно. Это должен быть myurl.html Посмотрите, как sling выбирает скрипт для запуска. Скорее всего, вы хотите .html в качестве расширения, если только вы не хотите, чтобы вывод был в каком-то другом формате (json), и у вас есть скрипт json.jsp в ваших компонентах. - person Brenn; 05.12.2014