Попытка удалить путь, расширение файла и, если есть, определенный параметр запроса

Я новичок в .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&param2=b

ЖЕЛАЕМЫЙ результат: https://www.example.com/mypage?param1=a&param2=b

Пример 2:

Ввод: https://www.example.com/2019/12/mypage.html?param1=a&m=1&param2=b

ЖЕЛАЕМЫЙ результат: https://www.example.com/2019/12/mypage?param1=a&param2=b

В обоих приведенных выше примерах все следующее удалено:

  • /p если есть

  • .html если есть

  • m=1 если присутствует (иногда это может быть единственный параметр запроса, так что это тоже нужно учитывать)

(Кстати, приведенные выше три пункта будут полезны для тех, кто переносит сайт с Blogger/Blogspot на Wordpress, поскольку они отражают различия в том, как обрабатываются пути и страницы.)

Очень признателен за любую помощь в удалении m=1, если он присутствует.

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
0
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Не могли бы вы попробовать следующее, написанное в соответствии с показанными образцами. Также убедитесь, что вы очистили кеш браузера перед тестированием 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]

Я думаю, что ваше первое решение ОЧЕНЬ близко к тому, что мне нужно. Спасибо. Для пояснения, параметр запроса m=1 иногда может быть первым, а иногда вторым, третьим и т. д. Поэтому иногда он будет показывать ?m=1, а иногда &m=1, и в любом случае его нужно удалить. И я хотел бы сохранить ВСЕ другие параметры запроса, если они есть. Как бы я добавил это, пожалуйста?

l_r 20.12.2020 17:52

@l_r, добро пожаловать, не могли бы вы попробовать мое отредактированное 1-е решение сейчас? Я сделал это, чтобы найти ?m или &m, пожалуйста, дайте мне знать, как это происходит. По всем остальным параметрам он должен их поймать, я думаю, дайте мне знать, как это происходит.

RavinderSingh13 20.12.2020 17:56

Спасибо за вашу помощь. Мне удалось заставить все сценарии работать с ответом @anubhava (поэтому я не полностью проверял, работает ли ваше решение во всех сценариях). Очень ценю помощь от этого сообщества.

l_r 20.12.2020 18:25

@l_r, Добро пожаловать, мы все учимся друг у друга :) Анубхава - ГУРУ Apache, ура и счастливого обучения.

RavinderSingh13 20.12.2020 18:26

@l_r, Здравствуйте, я протестировал правила (1-е решение) со ссылками https://www.example.com/p/mypage.html?param1=a&m=1&param2=b И https://www.example.com/2019/12/mypage.html?param1=a&m=1&par‌​am2=b, и это сработало для них обоих, не могли бы вы сообщить мне, в каком случае это не работает с примерами ссылок, пожалуйста, просто хочу исправить это для вашего другие случаи, ура.

RavinderSingh13 20.12.2020 19:18

Вы можете использовать следующее правило, чтобы удалить параметр запроса 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 в вашей последней строке выше? (я бы этого хотел)

l_r 20.12.2020 17:36

Извините, у меня была опечатка, сейчас исправил. Соответствует m=1 в строке запроса.

anubhava 20.12.2020 17:58

Кажется, работает отлично! Я проверяю все возможные сценарии: с /p или без него, с .html или без него, с m=1 или без него, без передачи параметров запроса, с передачей большого количества параметров запроса (иногда с m=1, а иногда без него как один из них). Спасибо!

l_r 20.12.2020 18:23

Другие вопросы по теме