Редиректы в nginx

Часть перенаправлений решение сделать не может: они должны сработать раньше, чем запрос дойдёт до сайта. Это склейка домена с www и без, удаление index.php из адреса, приведение адресов к единому виду. Такие правила прописываются в конфигурации nginx.

Ошибка в конфигурации nginx кладёт сайт целиком. Перед правками сделайте копию файла, а после изменений обязательно проверьте конфигурацию командой nginx -t — она покажет ошибку до перезапуска.

Какие файлы править

Подключитесь к серверу по SSH или sFTP (WinSCP, FileZilla) и откройте папку /etc/nginx/bx/site_avaliable.

Если на машине один сайт, файлы называются s1.conf (для HTTP) и ssl.s1.conf (для HTTPS). Если сайтов несколько, в названии будет домен: bx_ext_example.com.conf и bx_ext_ssl_example.com.conf.

Правьте оба файла — и HTTP, и HTTPS.

Правила внутри блока server

Эти правила добавляются после строки server_name_in_redirect off;.

Убрать **index.php** из адреса:

if ($request_uri ~ "^(.*)index\.(?:php|html)") {
    return 301 $1;
}

Добавить слеш в конце адреса:

if ($request_uri !~* "/api/.*") {
    rewrite ^([^.]*[^/])$ $1/ permanent;
}

Исключение для /api/ обязательно: через этот адрес работает обмен клиентской части с сервером, и добавленный слеш его сломает.

Убрать двойной слеш:

if ($request_uri ~ "^[^?]*?//") {
    rewrite "^" $scheme://$host$uri permanent;
}

Склейка www и без www

Для этого нужен отдельный блок server, и добавляется он в начало файла.

Для HTTPS:

server {
    listen 443 ssl http2;

    server_name www.example.ru;
    return 301 https://example.ru$request_uri;

    # CERTIFICATE ANSIBLE MANAGED BLOCK
    include bx/conf/ssl_options.conf;
    ssl_certificate /fullchain.pem;
    ssl_certificate_key /privkey.pem;
    ssl_trusted_certificate /chain.pem;
    # CERTIFICATE ANSIBLE MANAGED BLOCK
}

Блок с сертификатом скопируйте из основного блока server того же файла — он ближе к концу.

Для HTTP:

server {
    listen 80;

    server_name www.example.ru;
    return 301 https://example.ru$request_uri;
}

Здесь example.ru — ваш домен. После этого удалите домен с www из строки server_name основного блока, если он там есть, — иначе запрос до нового блока не дойдёт.

Применить изменения

Проверьте конфигурацию и перезапустите nginx:

nginx -t
systemctl restart nginx

nginx -t должен ответить syntax is ok и test is successful. Если вместо этого выводится ошибка с номером строки — исправьте её и проверьте снова; перезапускать nginx со сломанным конфигом нельзя.

Проверка

Откройте в браузере адрес с www, адрес с index.php и адрес без слеша на конце — все три должны перебросить на правильный вид. Заодно убедитесь, что обычные страницы каталога и оформление заказа продолжают работать.

Правила для отдельных страниц удобнее делать не здесь, а в админке: Редиректы.