WordPress и NGINX – постоянные ссылки не работают с завершающим слэшем

Вопрос или проблема

Я добавил эту строку в файл конфигурации nginx

try_files $uri $uri/ /index.php?$args;
rewrite ^([^.]*[^/])$ $1/ permanent; #добавление слэша

Постоянные ссылки работают нормально, но при добавлении слэша (пожалуйста, посмотрите правило переписывания, как я его добавляю) NGINX выдает ошибку 404.

Например,
somedomain.com/post/ThisIsPermaLink (работает)
после добавления слэша
somedomain.com/post/ThisIsPermaLink/ (выдает ошибку 404)

Но обе эти версии работают в среде Apache.
Apache перенаправляет все запросы без слэшей (somedomain.com/post/ThisIsPermaLink) на somedomain.com/post/ThisIsPermaLink/

Поэтому мне нужна такая же функциональность в NGINX

Я не думаю, что вам нужно это правило переписывания для добавления слэша. WordPress выполнит перенаправление за вас.

Я использую этот код для отладки перенаправления:

function wpse_287994_debug_redirect( $url ) {

    echo $url;
    die();
}

add_action( 'wp_redirect', 'wpse_287994_debug_redirect' );

Когда я пытаюсь посетить адрес http://example.com/lorem-ipsum (эта страница должна существовать), вышеуказанный скрипт выведет http://example.com/lorem-ipsum/, так что перенаправление на адрес со слэшем работает.

Моя конфигурация nginx выглядит следующим образом:

server {
  listen *:80;
  server_name           example.com;
  root                  /var/www/example;

  access_log            /var/log/nginx/access.log;
  error_log             /var/log/nginx/error.log;

  index index.php index.html;

  location / {
    # попытка обслужить файл напрямую, резервный вариант - index.php
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {

    include fastcgi.conf;

    fastcgi_pass 127.0.0.1:9070;
  }
}

В Nginx переписывания уже выполняются этой частью try_files $uri $uri/ /index.php?$args;. Эта часть означает нечто подобное.

Для местоположения, начинающегося с символа /, попытка загрузить файл из файловой системы, и если такого файла нет, переписать на index.php с аргументами.

Попробуйте следующее:
Замените:

try_files $uri $uri/ /index.php?$args;

на:

try_files $uri $uri/ /index.php$is_args$args;

В файле конфигурации nginx для вашего сайта.

Затем в постоянных ссылках (настройки WordPress)

Ответ или решение

Решение проблемы с пермаликами в WordPress на NGINX

При переходе с Apache на NGINX многие пользователи WordPress сталкиваются с проблемой, связанной с тем, что перма-линки (постоянные ссылки) не работают должным образом. В вашем случае проблема в том, что ссылки с завершающим слэшем (/) возвращают ошибку 404. Это связано с тем, что конфигурация NGINX не обрабатывает такие запросы подобным образом, как это делает Apache.

Анализ конфигурации и настройки

Ваше текущее правило в конфигурации NGINX:

try_files $uri $uri/ /index.php?$args;
rewrite ^([^.]*[^/])$ $1/ permanent; #adding slash

Первоначально вы добавили правило, которое должно было добавлять слэш в конце URL при его отсутствии. Однако взаимодействие между try_files и правилом переписи может создавать конфликты, что в конечном итоге приводит к ошибке 404 при запросе URL с завершающим слэшем.

Проблема с отсутствием слэша

Согласно стандартам HTTP и правилам WordPress, URL без завершающего слэша должен перенаправляться на его версию с завершающим слэшем. В NGINX это может быть реализовано с помощью правильной настройки try_files.

Рекомендуемое решение

Для исправления данной проблемы, измените одну строку в вашей конфигурации NGINX:

try_files $uri $uri/ /index.php$is_args$args;

Это изменит способ передачи аргументов в index.php и устранит конфликты, которые возникают из-за отсутствия слэша в URL. Теперь, когда NGINX не сможет найти файл или директорию, он будет корректно перенаправлять запросы к index.php, передавая правильно аргументы, если они присутствуют.

Пример полной конфигурации

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

server {
    listen *:80;
    server_name example.com;
    root /var/www/example;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass 127.0.0.1:9070; 
    }
}

Обновление настроек пермалинков

После внесения изменений в конфигурацию NGINX, рекомендуется зайти в административную панель WordPress и обновить настройки постоянных ссылок (пермалинков). Это заставит WordPress пересоздать свои правила и удостовериться, что все ссылки работают корректно.

Заключение

Следуя вышеизложенным рекомендациям, вы сможете устранить проблемы с пермаликами на вашем сайте WordPress, работающем на NGINX. Это обеспечит удобство навигации и улучшит общее восприятие вашего сайта пользователями.

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

Оцените материал
Добавить комментарий

Капча загружается...