AEM 6.3: Неверный запрос при замене точки в селекторе на косую черту

#apache #.htaccess #mod-rewrite #aem #dispatcher

#apache #.htaccess #модификация-перезапись #aem #диспетчер

Вопрос:

Я пытаюсь придать странице сведений о моем продукте следующий формат:

 https://stage.aemsite.com/en/product-details/some-product
 

Мы используем селекторы для сведений о нашем продукте, поэтому я понимаю, что AEM не сможет это интерпретировать, моя идея заключалась в том, чтобы использовать диспетчер, чтобы разрешить переход в правильный формат https://stage.aemsite.com/en/product-details.some-product , но это приводит к неправильному запросу.

Я тестировал это на https://technicalseo.com/tools/htaccess / и это должно технически работать.

 RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product-details/([^?]*)(/?)$
RewriteRule ^ https://%{SERVER_NAME}/%1/product-details.%2 [PT,L,NC]
 

Есть идеи?

РЕДАКТИРОВАТЬ: согласно правильному ответу, это был формат, который работал для меня, причина в том, что AEM нужен путь, чтобы быть путем к ресурсу внутри дерева содержимого.

 RewriteRule ^([a-z]{2})/product-details/([^?]*?)/?$ https://%{SERVER_NAME}/content/marketplace/$1/product-details.$2 [L]
 

Комментарии:

1. Не могли бы вы указать, какой URL https://stage.aemsite.com/en/product-details.some-product -адрес должен обслуживаться файлом или URL-адресом в бэкэнде? Пожалуйста, уточните один раз.

2. У AEM есть файл диспетчера (stage.conf), в этом файле я написал правила для сквозной передачи, это помогает? Что касается архитектуры, AEM основана на модели Sling

Ответ №1:

Я протестировал это https://technicalseo.com/tools/htaccess/ , и технически это должно работать.

Черт возьми, этот инструмент выглядит неправильно, IMO. (Я думаю, что это игнорирует PT флаг?)

 RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product-details/([^?]*)(/?)$
RewriteRule ^ https://%{SERVER_NAME}/%1/product-details.%2 [PT,L,NC]
 

«400 неверных запросов», скорее всего, связано с использованием флага PT (сквозного) с абсолютным URL. Вы не должны использовать здесь абсолютный URL-адрес (если только вы не хотите инициировать внешнее перенаправление или прокси-запрос), и PT тогда флаг не требуется в .htaccess контексте, поскольку это действие по умолчанию.

Конечная часть вашего регулярного ([^?]*)(/?)$ выражения, возможно, неверна. Похоже, вы пытаетесь опустить необязательную завершающую косую черту из первого захваченного подшаблона. Однако это не то, что делает это регулярное выражение. Поскольку предыдущий квантификатор ( * ) является жадным, он также будет использовать необязательную косую /? черту в конце, поэтому следующее на самом деле ничего не делает. Регулярное выражение ([^?]*)(/?)$ такое же, как ([^?]*)$ . (Также маловероятно, что у вас есть%-кодировка ? в URL-пути, так что это, вероятно, то же (.*) самое, что и .) Если вы хотите исключить необязательную завершающую косую черту из захвата, вам нужно было бы сделать предыдущий шаблон нежадным, чтобы он не использовал необязательную завершающую косую черту. например. ([^?]*?)/?$ (группа захвата в конце кажется излишней). Или используйте чередование, например. ([^?]*)(?:/|)$ . Или сделайте предыдущий шаблон более строгим, чтобы он не соответствовал косой черте. например. ^([w-]*)/?$ . (Примечание: если сделать конечную косую черту необязательной, это может привести к дублированию содержимого.)

Вам также не нужна RewriteCond директива, поскольку эта проверка может быть выполнена (более эффективно) в RewriteRule шаблоне.

NC Флаг в RewriteRule любом случае не применяется к условию, поэтому этот флаг является излишним в опубликованном вами правиле. Однако это будет служить только для продвижения дублированного контента.

Итак, учет вышеуказанных моментов приведет к следующему:

 RewriteRule ^([a-z]{2})/product-details/([^?]*?)/?$ $1/product-details.$2 [L]
 

ОДНАКО, работает это или нет с AEM (или любой CMS), это другой вопрос, поскольку AEM, вероятно, «видит» только запрошенный URL-адрес, содержащий косую черту. Переписанный URL-адрес, содержащий точку, в основном скрыт от серверного скрипта, если только он не ожидается и не знает, где искать. Когда URL-адрес переписывается подобным образом, Apache присваивает переменной REDIRECT_URL сервера значение переписанного URL-адреса, но CMS вряд ли это проверит, поскольку это не обязательно запрашиваемый URL-адрес.

Порядок этих директив .htaccess также важен. Предположительно, у вас есть шаблон фронт-контроллера позже в файле, который направляет запрос?

Комментарии:

1. Спасибо за подробное объяснение! Мне удалось получить доступ к журналам диспетчера, и я обнаружил следующую ошибку: [core: ошибка] [pid 20651: tid 139675540870912] [клиент 10.73.0.60:44460] AH00126: Недопустимый URI в запросе GET /en/product-details/some-product HTTP/1.1 Я думаю, что AEM ожидает, что URL-адрес будетбудьте относительны, моя страница на самом деле находится в /content/mysite/en/product-details.some-product.html

2. Я обновлю свой вопрос правильной переписью на основе вашего удивительного объяснения. Спасибо!

3. Пожалуйста. Эта «ошибка», по-видимому, является ошибкой Apache, связанной с «400 неверным запросом». Указанный «URL» — это содержимое Host заголовка первоначального запроса, а не URI, который переписывается, что, вероятно, и является причиной этой ошибки. «правильная перезапись» — но опубликованная вами директива, по-видимому, приводит к внешнему перенаправлению 302 (так что просто измените URL обратно)?

4. В итоге я использовал это, чтобы предотвратить 302 и вместо этого сохранить форматированный URL-адрес в браузере: RewriteRule ^/([a-z]{2})/product-details/([^?]*?)/?$ / контент/торговая площадка/ $ 1/подробная информация о продукте.$2.html [PT,L] это удовлетворяет всем требованиям 🙂

5. PT Флаг не требуется, если он .htaccess включен .