У меня есть установка 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 и 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 находится в нужном месте.