В очередной раз были замечены ошибки 404 в журнале моего сайта. Это не удивляет, поскольку ссылки периодически записываются с ошибками, туда добавляются различные символы и т.п.
Так как среднестатистический пользователь крайне нетерпелив, а потому исправлять и искать очевидные ошибки в URL часто не будет, а просто закроет сайт, и пойдёт дальше - то имеет смысл добавить правила в конфигурацию веб-сервера для перенаправления пользователя на нужную страницу.
В моём примере это веб-сервер Apache 2.4 (и 2.2), потому правки вносятся в файл .htaccess
1. Ошибки с %C2%A0 на конце URL
Причина: умные люди говорят, что это WISIWYG-редакторы нередко добавляют куда не следует, а потому мы и получаем такие ошибки.
Решение:
Правило выше удаляет %C2%A0 на конце ссылок. Т.е. URL вида site.com/path%C2%A0 преобразуется в site.com/path.
2. %20 (пробелы) в URL
Причина: обычная опечатка или проблемы при форматировании, репостах-перепостах.
Решение:
Это правило удаляет пробел или %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.
Решение:
Примечание: 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.
Так как среднестатистический пользователь крайне нетерпелив, а потому исправлять и искать очевидные ошибки в 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
Таким образом, получится RewriteRule ^(.*)\x23 /$1 [L,R=301]
В этом случае ссылка site.com/path%23anchor будет переадресовывать на site.com/path.
Ну и, разумеется, возможно, это не самые изящные решения, но у меня всё работает как положено на разных хостингах с apache 2.4.10 и 2.2.15.