Некоторые поисковики (не будем показывать пальцем в гугл) считают ссылки вида http://site.com/InDex и http://site.com/index разными ссылками. Из-за этого можно натыкать ссылок на InDex на других сайтах, гугл их поиндексирует и найдет дубликат страницы у вас на сайте. (/me почесал затылок). По крайней мере, мне так рассказывали. Меня же во всей этой истории заинтересовало, что эту «проблему» можно пофиксить nginx-ом (интересно, а чего он вообще не умеет?).
Для всего этого ада нам понадобится nginx с perl-модулем (на lua я писать вообще не умею, даже копипастить lua не умею — так что моё решение на перле), точнее собранный с —with-http_perl_module
Я его обычно в пакете nginx-extras отыскиваю.
После установки правильного nginx-а кидаем в файл /etc/nginx/conf.d/99_lowercase.conf такую билиберду:
perl_set $uri_lowercase 'sub {
my $r = shift;
my $uri = $r->uri;
$uri = lc($uri);
return $uri;
}';
perl_set $args_lowercase 'sub {
my $r = shift;
my $args = $r->args;
$args = lc($args);
return $args;
}';
А в конфиг нужного сайта:
location ~[A-Z] { return 301 $scheme://$http_host$uri_lowercase?$args; }
Теперь все ссылки вида http://site.com/Admin?admin=Admin будут редиректить на http://site.com/admin?admin=admin (то бишь не конкретно сюда, а на туже ссылку, но в нижнем регистре).
Ок, а как быть с кириллицей? Если к примеру запрашивают http://site.com/Admin?admin=Админ ?
А вот хз, там же урлы когда-то декодятся, когда-то нет.
Для русских, имхо, проще заменой символа на символ пройти.
Так-то perl в наши времена вроде utf-compatible (достаточно use utf8; добавить в функции), но вот как завернуть if и location в эту функцию с учетом замены символов сходу непонятно. Попробуйте регулярки вида [А-Я], может заработают.
Получилось сделать с кириллицей, может быть кому-нибудь будет полезно.
perl_set $uri_lowercase ‘sub {
use Encode;
my $r = shift;
my $uri = $r->uri;
$uri = Encode::encode_utf8(lc(Encode::decode_utf8($r->uri)));
return $uri;
}’;
location / {
if ( $uri != $uri_lowercase ) {
rewrite ^(.*)$ $scheme://$host$uri_lowercase permanent;
}
index index.php;
}
А еще можно не собирать кому не хочется, а просто поставить эти пакеты.
apt install nginx-full nginx-extras
«Я его обычно в пакете nginx-extras отыскиваю. «
nginx-full и nginx-extras, кстати, вместе не поставятся, это конфликтующие пакеты.
Действительно конфликтуют. Я ставил nginx-extras и он работает. Спасибо за дополнение!