URL-адрес перенаправления htaccess с конечным %20

Мы используем красивые URL-адреса на нашем сайте. Несколько лет назад у меня был внешний техник, который добавил обратные ссылки. Он проделал большую работу, но в одном случае постоянно добавлял ссылку с завершающим пробелом.

https://www.example.com/item/item/%20

Это было проиндексировано как %20, и я вижу в своих отчетах по обратным ссылкам, что существует 87 сайтов, которые указывают на URL-адрес с %20 в конце.

Если я смогу перенаправить это, то моя страница /item/item/ получит 87 обратных ссылок.

Мы используем правила перезаписи, и я испробовал здесь каждое решение по переполнению стека, но ни одно из них не сработало. Некоторые нерабочие решения:

RewriteEngine on
RewriteRule ^(.*[^\ ])\ +$ /$1

RedirectRule (.*)\s$ $1 [R=301]

RewriteRule ^(.*/|)[\s%20]+(.+)$ $1$2 

Пробовал редирект 301, тоже не работает.

redirect 301 /item/item/%20 /item/item/

redirect 301 /item/item/+ /item/item/

Некоторые вещи, которые помогают - это не шаблон для всего сайта. Это всего лишь один конкретный URL-адрес, который был неправильно распространен в мире. И нигде в строке нет пробела — он всегда в конце.

Спасибо.

Для меня также было бы неплохо преобразовать завершающий %20 в известный символ, такой как a, потому что я мог бы перенаправить его /item/item/- в item/item/


person user35546    schedule 16.01.2020    source источник
comment
Как ваш сервер в настоящее время отвечает на эти запросы с завершающим пробелом? 403 Запрещено? Как маршрутизируются эти URL-адреса? Является ли /item/item/ полностью виртуальным или каким-то образом связано с файловой системой?   -  person MrWhite    schedule 17.01.2020
comment
Он переходит на нашу страницу 404. Чтобы было понятно, входящая ссылка выглядит как /item/item/%20, и это то, что записано на нашем сайте. Я думаю, что меня смущает то, что правила htaccess работают с переведенным пробелом, а в синтаксисе htaccess пробел является разделителем. Также не используется обычная кодировка URL, такая как +.   -  person user35546    schedule 18.01.2020
comment
htaccess правила работают с переведенным пробелом - Не обязательно. URL-путь, соответствующий RewriteRule шаблону, декодируется на %, однако не все переменные сервера декодируются. пробел является разделителем - если аргумент содержит пробел, вы можете заключить весь аргумент в двойные кавычки (или убрать пробел с обратной косой черты - как вы сделали, или использовать класс сокращенных символов \s в регулярном выражении). обычная кодировка URL-адреса, такая как +, также не используется. + (закодированное пространство) применяется только к части строки запроса URL-адреса. В URL-пути + является литералом + (плюс).   -  person MrWhite    schedule 19.01.2020


Ответы (1)


Вы можете использовать это правило в качестве самого верхнего правила чуть ниже RewriteEngine On строки:

RewriteEngine On

RewriteRule ^(.*)(?:\s|\x20)+$ /$1 [L,NE,R=301]
person anubhava    schedule 17.01.2020
comment
Обязательно протестируйте в новом браузере и дайте мне знать, если он по какой-то причине не работает. - person anubhava; 17.01.2020
comment
Спасибо! Кажется, это работает и лучше, чем то, что я нашел. - person user35546; 18.01.2020