Debian.pro

Про Debian


Приводим все урлы на сайте в lowercase (нижний регистр) с помощью nginx

Некоторые поисковики (не будем показывать пальцем в гугл) считают ссылки вида 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_modules perl/lib;
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;
}';

А в конфиг нужного сайта:

if ( $args ~ [A-Z] ) { return 301 $scheme://$http_host$uri?$args_lowercase; }
location ~[A-Z] { return 301 $scheme://$http_host$uri_lowercase?$args; }

Теперь все ссылки вида http://site.com/Admin?admin=Admin будут редиректить на http://site.com/admin?admin=admin (то бишь не конкретно сюда, а на туже ссылку, но в нижнем регистре).


Комментарии (7):

  1. Ок, а как быть с кириллицей? Если к примеру запрашивают http://site.com/Admin?admin=Админ ?

  2. А вот хз, там же урлы когда-то декодятся, когда-то нет.
    Для русских, имхо, проще заменой символа на символ пройти.

    Так-то perl в наши времена вроде utf-compatible (достаточно use utf8; добавить в функции), но вот как завернуть if и location в эту функцию с учетом замены символов сходу непонятно. Попробуйте регулярки вида [А-Я], может заработают.

  3. Получилось сделать с кириллицей, может быть кому-нибудь будет полезно.

    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;
    }

  4. А еще можно не собирать кому не хочется, а просто поставить эти пакеты.
    apt install nginx-full nginx-extras

  5. «Я его обычно в пакете nginx-extras отыскиваю. «

  6. nginx-full и nginx-extras, кстати, вместе не поставятся, это конфликтующие пакеты.

  7. Действительно конфликтуют. Я ставил nginx-extras и он работает. Спасибо за дополнение!

Написать комментарий