#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
включен .