Редиректы в 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 nginxnginx -t должен ответить syntax is ok и test is successful. Если вместо этого выводится ошибка с номером строки — исправьте её и проверьте снова; перезапускать nginx со сломанным конфигом нельзя.
Проверка
Откройте в браузере адрес с www, адрес с index.php и адрес без слеша на конце — все три должны перебросить на правильный вид. Заодно убедитесь, что обычные страницы каталога и оформление заказа продолжают работать.
Правила для отдельных страниц удобнее делать не здесь, а в админке: Редиректы.