Я новичок в .htaccess, но приблизился к тому, что мне нужно, но теперь застрял.
Ввод: https://www.example.com/p/mypage.html
Выход: https://www.example.com/mypage
Это достигается следующим:
# Static pages: Remove /p from path and remove .html
RewriteRule ^p(/.*?)(?:\.html)?$ $1 [R=301,L]
# All other posts just remove .html
RewriteCond %{REQUEST_URI} ^/(.+)\.html?$ [NC]
RewriteRule ^ /%1 [L,R=301]
Однако очень часто есть параметр запроса m=1, который необходимо удалить, ЕСЛИ ОН ПРИСУТСТВУЕТ.
Мне нужно, чтобы этот параметр запроса был удален как для статических страниц, так и для других сообщений в приведенных выше RewriteRules. Обратите внимание, что очень часто могут присутствовать и другие параметры запроса, но я не хочу, чтобы они удалялись.
Пример 1:
Ввод: https://www.example.com/p/mypage.html?param1=a&m=1¶m2=b
ЖЕЛАЕМЫЙ результат: https://www.example.com/mypage?param1=a¶m2=b
Пример 2:
Ввод: https://www.example.com/2019/12/mypage.html?param1=a&m=1¶m2=b
ЖЕЛАЕМЫЙ результат: https://www.example.com/2019/12/mypage?param1=a¶m2=b
В обоих приведенных выше примерах все следующее удалено:
/p
если есть
.html
если есть
m=1
если присутствует (иногда это может быть единственный параметр запроса, так что это тоже нужно учитывать)
(Кстати, приведенные выше три пункта будут полезны для тех, кто переносит сайт с Blogger/Blogspot на Wordpress, поскольку они отражают различия в том, как обрабатываются пути и страницы.)
Очень признателен за любую помощь в удалении m=1
, если он присутствует.
Не могли бы вы попробовать следующее, написанное в соответствии с показанными образцами. Также убедитесь, что вы очистили кеш браузера перед тестированием URL-адресов.
RewriteEngine ON
# Static pages: Remove /p from path and remove .html
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^p(/.*?)(?:\.html)?$ $1 [R=301,L]
# All other posts just remove .html
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} ^/(.+)\.html?$ [NC]
RewriteRule ^ %1 [L,R=301]
#Check if URI has .html with query string present in it.
RewriteCond %{THE_REQUEST} \s(?:/p)?/(.*)\.html\?(.*)(?:[&?])m=1(.*)\s [NC]
RewriteRule ^ %1?%2%3 [R=301,L]
2-е решение: если вы ищете только параметры param1 и param2, попробуйте выполнить следующее.
RewriteEngine ON
# Static pages: Remove /p from path and remove .html
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^p(/.*?)(?:\.html)?$ $1 [R=301,L]
# All other posts just remove .html
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} ^/(.+)\.html?$ [NC]
RewriteRule ^ %1 [L,R=301]
#Check if URI has .html with query string present in it.
RewriteCond %{THE_REQUEST} \s(?:/p)?/(.*)\.html\?(param1=[^&]*)(?:[?&])m=1(param2=[^\s]*)\s [NC]
RewriteRule ^ %1?%2%3 [R=301,L]
@l_r, добро пожаловать, не могли бы вы попробовать мое отредактированное 1-е решение сейчас? Я сделал это, чтобы найти ?m
или &m
, пожалуйста, дайте мне знать, как это происходит. По всем остальным параметрам он должен их поймать, я думаю, дайте мне знать, как это происходит.
Спасибо за вашу помощь. Мне удалось заставить все сценарии работать с ответом @anubhava (поэтому я не полностью проверял, работает ли ваше решение во всех сценариях). Очень ценю помощь от этого сообщества.
@l_r, Добро пожаловать, мы все учимся друг у друга :) Анубхава - ГУРУ Apache, ура и счастливого обучения.
@l_r, Здравствуйте, я протестировал правила (1-е решение) со ссылками https://www.example.com/p/mypage.html?param1=a&m=1¶m2=b
И https://www.example.com/2019/12/mypage.html?param1=a&m=1¶m2=b
, и это сработало для них обоих, не могли бы вы сообщить мне, в каком случае это не работает с примерами ссылок, пожалуйста, просто хочу исправить это для вашего другие случаи, ура.
Вы можете использовать следующее правило, чтобы удалить параметр запроса m=1
из ваших URL-адресов.
RewriteEngine on
RewriteCond %{QUERY_STRING} (.*?)&?(?:\bm=1)(.*)$
RewriteRule ^ %{REQUEST_URI}?%1%2 [R,L]
Вы можете использовать это правило, чтобы удалить параметр запроса, если он присутствует, а также удалить /p
или .html
.
Вот ваш полный .htaccess:
RewriteEngine On
RewriteCond %{THE_REQUEST} \?(.*&)?m=1&?(\S*)\sHTTP [NC]
RewriteRule ^(?:p/)?(.+)(?:\.html)?$ /$1?%1%2 [R=301,NE,NC,L]
# Static pages: Remove /p from path and remove .html
RewriteRule ^p(/.*?)(?:\.html)?$ $1 [R=301,L,NC,NE]
# All other posts just remove .html
RewriteRule ^(.+)\.html$ /$1 [L,R=301,NC,NE]
Спасибо! Можете ли вы помочь мне понять, что делает ваша строка RewriteCond? Я вижу в нем \sHTTP, и у меня уже есть строки в моем файле: RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Кроме того, это также избавит git от m = 1 в вашей последней строке выше? (я бы этого хотел)
Извините, у меня была опечатка, сейчас исправил. Соответствует m=1
в строке запроса.
Кажется, работает отлично! Я проверяю все возможные сценарии: с /p или без него, с .html или без него, с m=1 или без него, без передачи параметров запроса, с передачей большого количества параметров запроса (иногда с m=1, а иногда без него как один из них). Спасибо!
Я думаю, что ваше первое решение ОЧЕНЬ близко к тому, что мне нужно. Спасибо. Для пояснения, параметр запроса m=1 иногда может быть первым, а иногда вторым, третьим и т. д. Поэтому иногда он будет показывать
?m=1
, а иногда&m=1
, и в любом случае его нужно удалить. И я хотел бы сохранить ВСЕ другие параметры запроса, если они есть. Как бы я добавил это, пожалуйста?