На наших серверах не используется Apache2 по многим причинам, включая низкую производительность и высокое потребление ресурсов. Поэтому, вместо привычной работы с .htaccess файлами, вы можете конфигурировать nginx.

Что нужно знать?

Полезные примеры

Редирект со всех доменов, включая служебный, на один каноничный хост:

if ($host != 'mysite.ru') {
    return 301 $scheme://mysite.ru$request_uri;
}

Отлично подходит для организации редиректа с www. на без-www.*

Редирект всех www.* доменов на без-www:

if ($host ~ "^www\.(.*)$") {
    return 301 $scheme://$1$request_uri;
}


Редирект только с определённого домена:

if ($host = 'mysite.ru') {
    return 301 http://not-my-site.ru$request_uri;
}


Редирект с index.php на корень сайта:

if ($request_uri ~* '^/index.php$') {
    return 301 /;
}


Добавление адресам слеша в конце

if ($request_uri !~* "(?:\?)|(?:\.\w+$)|(?:\/$)") {
    return 301 $request_uri/;
}


Удаление слеша на конце адресов

Если вы изменили адрес админки MODX, то нужно указать его в условии этого правила, иначе будет бесконечный редирект.

if ($request_uri ~ ".*/$") {
    rewrite ^/((?!manager|setup).*)/$ /$1 permanent;
}


Удаление расширения .html

Нужно отредактировать уже имеющийся в правилах по умолчанию блок location /:

location / {
    try_files    $uri $uri/ @rewrite;
    rewrite      ^/(.*?).html$ /$1 permanent;
}


Редирект на https протокол

if ($scheme = 'http') {
    return    301    https://$host$request_uri;
}


Запрет доступа в служебные директории MODX со всех ip адресов, кроме определенных:

Если админкой сайта пользуется ограниченный круг менеджеров с одних и тех же ip адресов, то имеет смысл ограничить доступ в служебные директории только для них:

location ~* ^/(manager|core|connectors)/ {
    allow           196.198.15.183;
    allow           135.158.250.19;
    deny            all;
    # Если пользователь прошел проверку, то из этого блока он уже не выйдет
    # Поэтому здесь нужна отдельная работа с php
    location ~* \.php$ {
        include             fastcgi_params;
        fastcgi_param       SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass        backend-s55; # Обратите внимание на имя процесса php
    }
}


Базовая авторизация в служебные директории

Более универсальный запрет в служебные директории для неопределенного круга лиц с динамическими ip - базовая авторизация. Это запрос пароля веб-сервером, который работает до php файлов, что защищает вас от возможных уязвимостей в механизме авторизации «движка».

Нужно создать файл .htpasswd на этом сервисе и загрузить его в вашу директорию сайта, выше www. Файл, по сути, простой перечень имён пользователей с захешированными паролями через разделитель.

По умолчанию добавляется один пользователь, но вы можете сгенерировать так еще несколько файлов и просто скопировать строки из них в первый. Каждый юзер находится в отдельной строке! Пароли в этом файле не должны совпадать с паролями в админке, иначе нет никакого смысла в такой защите.

Теперь нужно указать Nginx использовать ваш файл .htpasswd для доступа в служебные директории.

location ~* ^/(manager|core|connectors)/ {
    auth_basic "Restricted Access";
    auth_basic_user_file /home/вашлогин/.htpasswd;
    try_files               $uri $uri/ @rewrite;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    backend-вашлогин;
    }
}


При попытке входа в админку вы увидите базовую авторизацию:

Внимание! Если вы создаёте файл через файловый менеджер Sprut - обязательно проверьте его аттрибуты. Права файла должны быть равны 644, иначе Nginx не сможет его прочитать и вы получите ошибку 500 при авторизации.

Конвертация правил

Если у вас уже есть готовые правила для Apache2, то вы можете попробовать сконвертировать их в правила Nginx с помощью онлайн конвертора.