Перенаправить параметр AMP на его постоянную ссылку

logo11d 4 1

Проблемные URL-адреса, добавленные плагином amp, распространяются на весь сайт (а не только на URL-адрес публикации ).

Post URL
https://www,example,com/post?amp
https://www,example,com/post?amp=0
https://www,example,com/post?amp=1
https://www,example,com/post?noamp
https://www,example,com/post?noamp=mobile
https://www,example,com/post?noamp=1
https://www,example,com/post/amp/
https://www,example,com/post/amp

Category URL
https://www,example,com/category/123?amp
https://www,example,com/category/123?amp=0
https://www,example,com/category/123?amp=1
https://www,example,com/category/123?noamp
https://www,example,com/category/123?noamp=mobile
https://www,example,com/category/123?noamp=1
https://www,example,com/category/123/amp/
https://www,example,com/category/123/amp

Tag Archieve 
https://www,example,com/tag/123?amp
https://www,example,com/tag/123?amp=0
https://www,example,com/tag/123?amp=1
https://www,example,com/tag/123?noamp
https://www,example,com/tag/123?noamp=mobile
https://www,example,com/tag/123?noamp=1
https://www,example,com/tag/123/amp/
https://www,example,com/tag/123/amp

Paginated and search result variation example
https://www,example,com/tag/123/page/1?amp
https://www,example,com/category/123/page/1?amp
https://www,example,com/page/1?noamp=mobile
https://www,example,com/?q=search_term&amp

Можно ли в  .htaccess перехватить все эти параметры URL и перенаправить их на соответствующую постоянную ссылку?

Это удалит завершающий символ /amp(или /amp/) в конце любого URL-пути.

Это также удалит параметр ampили noampURL в строке запроса (и его необязательное значение ) в любом URL, сохранив все остальные параметры URL. Сохраняя это как единое правило, это удалит как завершающий символ /ampв URL-пути, так и ampпараметр URL в одном перенаправлении (хотя это может быть не обязательно здесь).

Попробуйте следующее перед существующим блоком кода WP, т. е. перед # BEGIN WordPressмаркером комментария.

# Redirect old "amp" URLs back to permalink (general version)
RewriteCond %{QUERY_STRING} ^(.*&)?(?:no)?amp(?:=[^&]*)?&?(.*)$ [OR]
RewriteCond %{REQUEST_URI} /amp/?$
RewriteRule ^/?(.*?)(/amp/?)?$ /$1?%1%2 [NE,R=301,L]

Шаблон соответствует любому URL-пути RewriteRule , ^/?(.*?)(/amp/?)?$ но захватывает только часть URL до /amp(или /amp/) — если присутствует — в конце URL-пути. Если /amp(или /amp/) не появляется в конце URL-пути, то захватывается весь URL-путь (за исключением префикса слеша, если он используется в контексте сервера ). Это захватывается в $1обратной ссылке.

Затем два условия ( RewriteCondдирективы) проверяют, содержит ли строка запроса ampпараметр URL ИЛИ URL-путь заканчивается на /amp/. Если строка запроса содержит ampпараметр URL, то этот параметр URL удаляется путем захвата частей строки запроса до и после этого параметра в обратных ссылках %1и %2соответственно — которые используются позже в строке подстановки для восстановления строки запроса. Если ampпараметр URL отсутствует в строке запроса, то обратные ссылки %1и %2пусты, и мы по сути добавляем пустую строку запроса (которая удаляется Apache при построении Locationзаголовка).

Это зависит от нескольких дополнительных функций Apache:

  • Перед отправкой ответа перенаправления (в заголовке) обратно клиенту удаляется посторонний символ &в конце строки запроса . Это произойдет, когда параметр URL является последним параметром URL и ему предшествуют другие параметры URL. например, сокращается до приведенным выше правилом, но сам Apache затем удаляет завершающий символ , поэтому конечный результат на самом деле равен .Locationamp?q=search_term&amp?q=search_term&&?q=search_term
  • Также удаляется посторонний текст ?в конце URL-пути (т. е. пустая строка запроса).
  • Учитывая два вышеизложенных пункта… Единственный пограничный случай, в котором это «не срабатывает» (в очень мягкой форме), это если вы получили запрос на ?&amp(возможно, неправильно сформированную строку запроса), где нет предшествующего параметра URL, но все еще есть разделитель параметров URL, тогда это будет сокращено до <url-path>?— завершающий элемент ?все еще присутствует в ответе (и виден в браузере). Учитывая результирующую строку запроса только ?&, Apache удаляет только завершающий элемент &(согласно примечанию выше), а не & и ? . Если это когда-либо станет проблемой, то вы можете удалить случайный элемент ?(пустую строку запроса) с помощью дополнительного перенаправления .

Флаг NE, скорее всего, потребуется (особенно для последнего примера, т.е. /?q=search_term&amp), чтобы предотвратить двойное URL-кодирование строки запроса в ответе. QUERY_STRINGПеременная сервера не %-декодирована, поэтому %1и %2обратные ссылки уже %-кодированы.

Вам не нужно повторять RewriteEngineдирективу, которая уже встречается далее в блоке кода WP.

Сначала протестируйте перенаправление 302 (временное), чтобы избежать потенциальных проблем с кэшированием.

Перед тестированием убедитесь, что все кэши (браузера) очищены.

    Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
    Принять