Проблемные 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&
Можно ли в .htaccess перехватить все эти параметры URL и перенаправить их на соответствующую постоянную ссылку?
Это удалит завершающий символ /amp
(или /amp/
) в конце любого URL-пути.
Это также удалит параметр amp
или noamp
URL в строке запроса (и его необязательное значение ) в любом 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 затем удаляет завершающий символ , поэтому конечный результат на самом деле равен .Location
amp
?q=search_term&
?q=search_term&
&
?q=search_term
- Также удаляется посторонний текст
?
в конце URL-пути (т. е. пустая строка запроса). - Учитывая два вышеизложенных пункта… Единственный пограничный случай, в котором это «не срабатывает» (в очень мягкой форме), это если вы получили запрос на
?&
(возможно, неправильно сформированную строку запроса), где нет предшествующего параметра URL, но все еще есть разделитель параметров URL, тогда это будет сокращено до<url-path>?
— завершающий элемент?
все еще присутствует в ответе (и виден в браузере). Учитывая результирующую строку запроса только?&
, Apache удаляет только завершающий элемент&
(согласно примечанию выше), а не&
и?
. Если это когда-либо станет проблемой, то вы можете удалить случайный элемент?
(пустую строку запроса) с помощью дополнительного перенаправления .
Флаг NE
, скорее всего, потребуется (особенно для последнего примера, т.е. /?q=search_term&
), чтобы предотвратить двойное URL-кодирование строки запроса в ответе. QUERY_STRING
Переменная сервера не %-декодирована, поэтому %1
и %2
обратные ссылки уже %-кодированы.
Вам не нужно повторять RewriteEngine
директиву, которая уже встречается далее в блоке кода WP.
Сначала протестируйте перенаправление 302 (временное), чтобы избежать потенциальных проблем с кэшированием.
Перед тестированием убедитесь, что все кэши (браузера) очищены.