Gerga: Я понял. "%3F" - это код вопросительного знака. Не используется знак "?", чтобы не было воспринято как передача GET-параметров в исполняемый php файл?
А когда происходит замена "%3F" на вопросительный знак?
Всё верно "%3F" это код вопросительного знака.
В RewriteRule c шаблоном сопоставляется строка уже в нормализованном виде, т.е после преобразования относительных элементов пути ".", ".." и декодирования текста, заданного в виде %XX.
Флаг [L] останавливает текущую итерацию обработки запроса, а mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться.
Перед началом очередной итерации обработки запроса снова происходит преобразование "." ".." и декодирование %XX.
Ну всё как обычно. Ставили редирект в самый конец файла и ничего не работало.
Редиректы нужно ставить в начало файла.
Перед проверкой не забывать сбрасывать кэш браузера или использовать какой-нибудь онлайн сервис например, bertal.ru.
Возможно сам wordpress делает редирект на адрес без / и .htaccess тут не поможет.
RewriteRule (.+)/$ https://%{HTTP_HOST}/$1 [R=301,L]
Заменить (.+)/$ на ^(.+\.html)/$
Исключить несколько файлов можно без if
Я понял. "%3F" - это код вопросительного знака. Не используется знак "?", чтобы не было воспринято как передача GET-параметров в исполняемый php файл?
А когда происходит замена "%3F" на вопросительный знак?
Всё верно "%3F" это код вопросительного знака.
В RewriteRule c шаблоном сопоставляется строка уже в нормализованном виде, т.е после преобразования относительных элементов пути ".", ".." и декодирования текста, заданного в виде %XX.
Флаг [L] останавливает текущую итерацию обработки запроса, а mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться.
Перед началом очередной итерации обработки запроса снова происходит преобразование "." ".." и декодирование %XX.
https://habr.com/en/company/sprinthost/blog/129560/
Или
RewriteCond %{REQUEST_FILENAME}?%{QUERY_STRING} -fRewriteRule (.+) /$1\%3F%{QUERY_STRING}? [L]
if ($request_uri ~ "^/\?q=&p=(\d+)") {return 301 /page/$1;
}
После внутреннего перенаправления на /404.html этот адрес снова проверяется правилами mod_rewrite.
Или так
запрос без параметров, но с символом "?" на конце? Например site.ru/? или site.ru/razdel/ctranica?
Тогда вместо
Ставить
RewriteCond %{THE_REQUEST} "GET \S+\?"