Назад | Перейти на главную страницу

Конфигурация Nginx не работает с wordpress в подкаталоге

У меня есть установка nginx, которая мне нужна для размещения разрабатываемых веб-сайтов, чтобы другие люди могли их протестировать.

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

PHP работает, но я продолжаю получать 404-е для чего-либо, кроме / или / wp-admin /, все остальные постоянные ссылки дают 404-е. Я сделал почти все, чтобы это работало, но я понятия не имею, что делаю не так. Пожалуйста, укажите на мою ошибку в следующей конфигурации:

server {
  listen 80;
  server_name dev.example.com;
  client_max_body_size 20m;
  server_tokens off;

  root /srv/dev.example.com;
  index index.php index.html index.htm;

  location / {
    deny all;
  }

  location /my-site {
    allow all;

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

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/auth.d/.htpasswd-my-site;

    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_index index.php;
      fastcgi_pass php5-fpm-sock;
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_intercept_errors on;
      fastcgi_param HTTPS $https;
    }
  }
}

Спасибо!

ОБНОВИТЬ:

Этот запрос будет работать: http://dev.example.com/my-site/, это приведет к загрузке файла /srv/dev.example.com/my-site/index.php.

Также подойдет запрос к интерфейсу администратора WordPress: http://dev.example.com/my-site/wp/wp-admin, также переход непосредственно в индексный файл: /srv/dev.example.com/my-site/wp/wp-admin/index.php. В интерфейсе администратора все работает, поскольку он не использует постоянные ссылки, а необработанный ввод GET.

Однако, как только я пытаюсь загрузить постоянную ссылку (я использую самый простой формат /%postname%/) он не может найти его и директиву try_files в location /my-site {} должны соответствовать им. Это означает, что такие маршруты, как следующие, не работают:

http://dev.example.com/my-site/about
http://dev.example.com/my-site/contact
http://dev.example.com/my-site/etc

Я предполагаю, что следующие файлы не существуют в вашей файловой системе:

/srv/dev.example.com/my-site/about/index.{php,html,htm}
/srv/dev.example.com/my-site/contact/index.{php,html,htm}
/srv/dev.example.com/my-site/etc/index.{php,html,htm}

Ваша проблема возникает из-за того, что ваше резервное местоположение php вложено в /my-site место и это try_files Директива может работать не так, как вы ожидаете.

На самом деле, try_files принимает в качестве последнего параметра:

  1. URI
  2. названное место
  3. код HTTP

Для вариантов 1 и 2 это будет означать внутреннее перенаправление к указанному элементу. В твоем случае /index.php?$args интерпретируется как URI, и nginx будет перенаправлять на него внутренне, если $uri, $uri/, $uri/index.php, $uri/index.html, $uri/index.htm не хватает.

Теперь другая вещь: вы используете вложенное местоположение для обработки файлов php. Но как ваш try_files последний параметр - это /index.php?$args URI не будет соответствовать местоположению вершины /my-site поэтому он обрабатывается серверным блоком, и если URI не может быть преобразован в локальный файл, вы получите ответ HTTP 404.

Обратите внимание, что index директива также будет подразумевать внутренние перенаправления на указанные индексные файлы, но поскольку URI начинаются с /my-site он всегда будет находиться в вашем местоположении php.

Таким образом, вы должны либо переместить это место на тот же уровень, что и другие, либо префикс вашего try_files URI с префиксом вашего местоположения вершины и убедитесь, что файл php находится в нужном месте.