Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

вторник, 30 июля 2019 г.

Несколько простых правил .htaccess

В очередной раз были замечены ошибки 404 в журнале моего сайта. Это не удивляет, поскольку ссылки периодически записываются с ошибками, туда добавляются различные символы и т.п.

Так как среднестатистический пользователь крайне нетерпелив, а потому исправлять и искать очевидные ошибки в URL часто не будет, а просто закроет сайт, и пойдёт дальше - то имеет смысл добавить правила в конфигурацию веб-сервера для перенаправления пользователя на нужную страницу.

В моём примере это веб-сервер Apache 2.4 (и 2.2), потому правки вносятся в файл .htaccess

1. Ошибки с %C2%A0 на конце URL

Причина: умные люди говорят, что это WISIWYG-редакторы нередко добавляют   куда не следует, а потому мы и получаем такие ошибки.

Решение:
RewriteRule ^(.*)\xC2\xA0/?$ /$1 [L,R=301]

Правило выше удаляет %C2%A0 на конце ссылок. Т.е. URL вида site.com/path%C2%A0 преобразуется в site.com/path.

2. %20 (пробелы) в URL

Причина: обычная опечатка или проблемы при форматировании, репостах-перепостах.

Решение:
RewriteRule ^(.*)\x20(.*)/?$ /$1$2 [L,R=301]

Это правило удаляет пробел или %20 из любой его части. Таким образом, URL вида site.com/pa%20th (site.com/pa th) и site.com/path%20 (site.com/path - с пробелом на конце) будут преобразовываться в site.com/path
 
3. Ошибки с %23 в URL

Причина: знак # в пути кодируется в %23, что иногда (из-за проблем с кодировками?) не отрабатывает как положено и приводит к ошибкам 404.

Решение:
RewriteRule ^(.*)\x23(.*) /$1#$2 [L,NE,R=301]
Эта строка переписывает ссылки вида site.com/path%23anchor на site.com/path#anchor


Примечание: NE - флаг NoEscape. Нужен для того, чтобы символ # не преобразовывался в %23 обратно (кстати, этот же пример как раз приведён в документации).

Также можно сделать переадресацию при такой ошибке не на якорь (anchor) в содержании страницы, а просто открывать стандартным образом. Для этого нужно удалить из правила следующее: ^(.*)\x23(.*) /$1#$2 [L,NE,R=301].
Таким образом, получится RewriteRule ^(.*)\x23 /$1 [L,R=301]
В этом случае ссылка site.com/path%23anchor будет переадресовывать на site.com/path.

Ну и, разумеется, возможно, это не самые изящные решения, но у меня всё работает как положено на разных хостингах с apache 2.4.10 и 2.2.15.

Комментариев нет:

Отправить комментарий