На наших серверах не используется Apache2 по многим причинам, включая низкую производительность и высокое потребление ресурсов. Поэтому, вместо привычной работы с .htaccess файлами, вы можете конфигурировать nginx.
Что нужно знать?
- При написании правил вы уже находитесь внутри блока
server { ... }
- Разрешены только 2 директивы: location и if.
- При сохранении конфигурации все неразрешенные директивы вырезаются, без оповещения об ошибке.
- После сохранения конфигурации, она тестируется самим nginx, и если есть ошибки - откатывается на предыдущую рабочую.
- Php-процесс, который обслуживает ваш сайт называется
backend-логин
, например -backend-s55
. - Стандартный редирект на index.php для MODX называется
@rewrite
- Если сохранить пустое окно, то будет добавлен стандартный конфиг. Если вам это всё ни о чем не говорит, посмотрите на примеры ниже.
Полезные примеры
Редирект со всех доменов, включая служебный, на один каноничный хост:
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;
}
Блокирование пользователей по IP или диапазону IP-адресов
Нужно отредактировать уже имеющийся в правилах по умолчанию блок location /
:
location / {
deny 45.94.142.57;
deny 95.174.65.0/24;
deny 5.255.0.0/16;
try_files $uri $uri/ @rewrite;
}
Блокирование ботов по User-Agent
if ($http_user_agent ~* (Ahrefs|MJ12bot|LinkpadBot|MauiBot)) {
return 403;
}
Запрет доступа в служебные директории 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 с помощью онлайн конвертора.