Как правильно настроить редиректы на VPS с NGINX для WordPress?

Здравствуйте! Мы недавно переехали на VPS и сталкиваемся с проблемами настройки конфигурации Nginx. У нас нет опыта в этой области, и настройки в .htaccess работали корректно. 

Сейчас мы хотим настроить редирект со всех страниц, чтобы адреса без завершающего слеша преобразовывались в адреса с ним (например, site.ru/category должен перенаправлять на site.ru/category/). Я нашел одно возможное решение, но оно приводит к ошибкам с формами Contact Form 7, видимо, из-за ошибки с JSON, которую нужно исключить. Я пробовал следующий код:

<pre><code>if (!-f $request_filename) {
        rewrite ^(.*[^/])$ $1/ permanent;
   }</code></pre>

Однако он ломает формы, и в консоли отображаются такие ошибки: 

wp-json/contact-form-7/v1/contact-forms/3598/feedback/:1 
Failed to load resource: the server responded with a status of 404.

Ранее мы использовали другой вариант в .htaccess, который, кажется, не ломал формы:

<pre><code>&lt;IfModule mod_rewrite.c&gt;
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !^/wp-json
  RewriteCond %{REQUEST_URI} !^/wp-admin
  RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+)/wp-json
  RewriteCond %{REQUEST_URI} !^/([_0-9a-zA-Z-]+)/wp-admin
  RewriteRule ^([^.]+)([^./])$ %{REQUEST_URI}/ [L,R=301,NE]
&lt;/IfModule&gt;</code></pre>

В данный момент у нас такая настройка, сделанная специалистом, без редиректа:

<pre><code>server {
    server_name site.ru www.site.ru;

    listen 45.130.42.228:443 ssl;

    ssl_certificate "/var/www/httpd-cert/site.ru_2024-04-26-20-58_20.crt";
    ssl_certificate_key "/var/www/httpd-cert/site.ru_2024-04-26-20-58_20.key";
    add_header Strict-Transport-Security "max-age=31536000" always;

    http2
</code></pre>

Не могли бы вы помочь с настройкой редиректа, чтобы он работал корректно и не ломал формы?
  • 26 декабря 2024 г. 18:16
Ответы на вопрос 1
Чтобы правильно настроить редиректы в NGINX для вашего WordPress сайта, следует учитывать, что если вы хотите добавить завершающий слэш к URL, но одновременно не нарушить работу REST API, необходимо тщательно прописать правила.

Вы можете использовать следующую конфигурацию, которая будет обрабатывать редиректы на URL с завершающим слэшем, избегая конфликтов с API и админкой WordPress:

```nginx
server {
    server_name site.ru www.site.ru;

    listen 45.130.42.228:443 ssl http2;

    ssl_certificate "/var/www/httpd-cert/site.ru_2024-04-26-20-58_20.crt";
    ssl_certificate_key "/var/www/httpd-cert/site.ru_2024-04-26-20-58_20.key";
    add_header Strict-Transport-Security "max-age=31536000" always;

    # Настройка редиректов со всех страниц без завершающего слэша
    location / {
        # Игнорируем REST API запросы
        if ($request_uri !~ ^/wp-json) {
            rewrite ^/(.*[^/])$ /$1/ permanent;
        }

        try_files $uri $uri/ /index.php?$args; # Для работы WordPress
    }

    # Добавьте ваши другие location блоки (например, для статических файлов и т. д.) здесь
}
```

### Пояснение:
1. **Проверка на `wp-json`**: Если URL начинается с `/wp-json`, то редирект не применяется. Это позволяет избежать проблем с формами и другими частью WordPress, использующими REST API.
   
2. **Использование `try_files`**: Проверяет, существует ли запрашиваемый файл, если нет — передаёт запрос в `index.php`, что является стандартным способом обработки запросов в WordPress.

3. **Редирект**: Применяется правило редиректа, которое добавляет завершающий слэш к адресам, которые не заканчиваются на `/`, если они не являются файлами и не попадают под исключения.

Не забудьте протестировать конфигурацию после изменений, для этого можно использовать команду:
```bash
nginx -t
```
Если тест прошёл успешно, перезапустите NGINX:
```bash
systemctl restart nginx
```

Теперь ваши редиректы должны работать корректно, и все запросы без завершающего слэша будут переадресовываться на соответствующие URL с завершающим слэшем без нарушений в работе Contact Form 7 или других частей сайта.
Похожие вопросы