Ошибка 404 при обслуживании WordPress на подкаталоге с помощью NGINX, как исправить?

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

Я бы хотел размещать проверочные ветки для staging, чтобы тестировать и получать отзывы перед публикацией на production. Я пытался следовать некоторой документации, предоставленной в интернете, такой как рецепты для NGINX ( https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/ ), безуспешно! Так как это исправить?

Шаблон для проверочных веток — /review-xxxxx или /review-xx_x-xxx. Я настроил конвейер развертывания для автоматической публикации на AWS ECS для веток review-*, и я хотел бы, чтобы они оставались приватными только для тестов и получения отзывов.

Я жестко прописал /review-ci, чтобы избежать необходимости решать проблемы с регулярными выражениями и упростить начало работы. Вы найдете путь /review-ci в файле конфигурации NGINX, чтобы было ясно, какова цель.

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

server {
    listen 80;
    server_name httpwordpress.docker.localhost;

    # Логи
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Настройки расположения по умолчанию
    location / {
        index index.php;
    }

    location /review-ci {
        index  index.php;
        try_files $uri $uri/ /review-ci/index.php?$args;
    }

    # Передача PHP скриптов серверу FastCGI
    location ~ \.php$ {

        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass php-fpm:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME 
        $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }


}

У меня активны постоянные ссылки, и я должен иметь возможность запросить foobar.com/review-ci/wp-admin и увидеть экран входа.

Когда я выполняю curl http://httpwordpress.docker.localhost/review-ci/wp-admin, я получаю:

404 page not found

Я также использую https://github.com/wp-graphql/wp-graphql, что означает, что адрес http://httpwordpress.docker.localhost/review-ci/graphql должен возвращать данные, но вместо этого я получаю 404.

Это небольшой шаг перед введением регулярного выражения, так как я хотел бы развернуть приложение на AWS ECS. И я сразу заметил, что это не сработало с моей первоначальной настройкой, которую я раскрыл и попросил помощи на serverfault ( https://serverfault.com/questions/988035/nginx-location-regex-for-prefixed-paths-failure ).

Между тем, просто полагаться на hostname и корневой путь, как показано ниже, хорошо работает в среде разработки. Но, к сожалению, для staging могут быть одновременные версии, которые содержат отдельные функции или требования, не готовые для публикации, и они сохраняются отдельно из-за соображений или имени ветки git, перед которым стоит review-, если требуется развернуть и иметь staging url.

server {
    listen 80;
    server_name httpwordpress.docker.localhost;

    root /var/www/html;
    index index.php;

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

    client_max_body_size 200m;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        client_max_body_size 200m;
    }

}

Кто-нибудь знает, как это исправить?

Спасибо за внимание и буду признателен за любые советы или подсказки!

Вы можете попробовать

location /review-ci {
    index  index.php;
    try_files $uri $uri/ /review-ci/index.php;
}

Вопрос выше касается /path-segment, а не /sub-directory или, как обычно называется в сообществе WP, /sub-folder. После большого числа попыток я бы советовал не пытаться создавать /routes, а вместо этого делать хостинг файлов в /sub-directory, чтобы упростить процесс. Решение представлено ниже.

Поскольку то, что я пытаюсь сделать, не соответствует каталогу в www $HOME, это сложно. Как и большинство примеров, которые мы находим в интернете для “WordPress в подкаталоге”, демонстрируют, что общепринятая практика состоит в хранении исходных файлов wp в месте, относительном к www $HOME. По этой причине я отказался от идеи создания /route (внимание, это не подкаталог, он не соответствует директории, например, www.foobar.com/review-foobar/wp-admin должно быть /var/www/home/, а не /var/www/home/review-foobar/wp-admin); я тестировал и видел, что это возможно сделать с использованием регулярных выражений и групп захвата, и NGINX alias; где я передавал бы сегмент wp-admin к alias /var/www/home/wp-admin вместо директив NGINX try_files или root. Возможно, это слишком сложно для понимания здесь, но смысл в том, что лучше придерживаться общепринятой практики и размещать файлы в подкаталоге, относительном к пути $HOME, чтобы избежать регулярных выражений и групп захвата, резервных сценариев и т.д.

Рабочая версия для общепринятой практики:

    server {
        listen PORT;
        server_name httpwordpress.docker.localhost;

        root /var/www/html;
        index index.html index.htm;

        location / {
        try_files $uri $uri/ =404;
        }

        location /review-staging {
            try_files $uri $uri/ /review-staging/index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass FPM_HOSTNAME:9000;
            fastcgi_index index.php;
        }
    }

Таким образом, сегмент /review-staging — это директория в $HOME, например, /var/www/html, где исходные файлы WP находятся в /var/www/html/review-staging. Помните, что это не то, о чем я спрашивал, но, похоже, это общепринятая практика здесь и она помогает облегчить некоторые затруднения при настройке.

.

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

Ваша проблема с NGINX связана с настройкой WordPress в подкаталоге на сервере, и возникшая ошибка 404 указывает на проблемы с маршрутизацией URL в конфигурациях NGINX. Рассмотрим теоретический аспект, используем примеры из конфигурации и предложим решение, применимое для вашей задачи.

Теория

Когда вы размещаете WordPress в подкаталоге (например, /review-ci), NGINX должен правильно направлять запросы на соответствующие PHP-скрипты. Ошибки типа 404 могут возникать из-за неправильной настройки директив try_files, которые отвечают за маршрутизацию запросов в файловой системе к корректным PHP-файлам, обрабатываемым сервером приложений php-fpm. В частности, переменные $uri и $args должны быть задействованы таким образом, чтобы правильно строить запрос в зависимости от входного URL.

Пример

Рассмотрим ваш текущий участок конфигурации:

location /review-ci {
    index index.php;
    try_files $uri $uri/ /review-ci/index.php?$args;
}

Применение и решение

  1. Убедитесь, что физический путь к файлам WordPress существует.

    Прежде всего, убедитесь, что в директории /var/www/html существует подкаталог review-ci, где хранятся все файлы WordPress. Это критично для корректного развертывания, особенно на сервере, где WordPress распределён по подкаталогам для отдельных веток разработки.

  2. Используйте обновленные директивы try_files.

    Ваша директива try_files неправильно перенаправляет запросы. Исправьте её для более корректного сопоставления:

    location /review-ci {
       alias /var/www/html/review-ci;
       try_files $uri $uri/ /review-ci/index.php?$args;
    }

    Здесь alias определяет точное сопоставление пути в файловой системе с URI, а не просто дописывает к root, как делают другие параметры.

  3. Корректное использование fastcgi_param.

    Убедитесь, что fastcgi_param SCRIPT_FILENAME правильно настроен:

    location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass php-fpm:9000;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
       client_max_body_size 200m;
    }

    fastcgi_param SCRIPT_FILENAME важен для передачи корректного пути к исполняемому скрипту PHP, иначе FastCGI не сможет определить, какой скрипт обрабатывать.

  4. Настройка постоянных ссылок и модулей.

    Убедитесь, что в панели управления WordPress постоянные ссылки (Permalinks) настроены правильно, например, установлены в режим "Post name", и эти настройки соответствуют указанной структуре URL в NGINX.

  5. Проверка и отладка.

    Используйте инструмент curl для проверки заголовков HTTP:

    curl -I http://httpwordpress.docker.localhost/review-ci/

    Убедитесь, что сервер возвращает ожидаемые заголовки и статус-коды.

Когда система будет корректно настроена, вы сможете открывать страницы, такие как http://httpwordpress.docker.localhost/review-ci/wp-admin, без ошибки 404. Это решение также позволит легко расширять конфигурацию для маршрутизации других веток с помощью простой модификации URI и соответствующих алиасов в конфигурационных файлах NGINX. Таким образом, вы достигнете гибкости в управлении изолированными средами для различных функций и этапов тестирования WordPress.

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

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