У меня есть три требования к моей настройке Nginx:
Из них я могу достичь первых двух, но когда я посещаю http://localhost/ecwid_fu_scripts/
через мой веб-браузер запрос перехватывается сервером Java, работающим на порту 9001, и не перенаправляется на index.php
в /home/ankush/ecwid_fu_scripts/
. Вот моя конфигурация Nginx:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /assets/images/ {
root /home/ankush/fu_main_files/;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 100;
}
location /ecwid_fu_scripts/ {
index index.php;
root /home/ankush/ecwid_fu_scripts/;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
location / {
proxy_pass http://localhost:9001;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Ваша проблема связана с root
директива, и объем этого root
.
location /ecwid_fu_scripts/ {
root /home/ankush/ecwid_fu_scripts/;
В этом случае, когда кто-то запрашивает example.com/ecwid_fu_scripts/, nginx ищет файлы в заданном root
, плюс расположение. Это становится / home / ankush / ecwid_fu_scripts / ecwid_fu_scripts /, а не там, где находится ваш index.php.
Чтобы решить эту проблему, у вас есть два варианта (предпочтительным вариантом является №2, если у вас есть свобода в своем проекте):
root
этого блока местоположения в / home / ankush / вместо этого.root
- директива вне любого блока местоположения - к новому имени папки проекта (скажем, root /home/ankush/ecwid_files/;
, после server_name
директива).Теперь нам все еще нужно добавить содержимое location ~ \.php$
блок внутри location /ecwid_fu_scripts/
блок, потому что когда root
изменяется, вещи, относящиеся к этому новому корню, должны использоваться в том же блоке. Это из-за эта ловушка: блок местоположения для ecwid_fu_scripts говорит, что это файл .php, он делает try_files, а затем он завершается этим блоком и отправляется в следующий связанный блок: глобальный location ~ \.php$
. Проблема в том, что он не знает, что root
больше не существует, поскольку он не определен глобально. Таким образом, fastcgi_pass в этом блоке не получает полный путь.
Итак, в итоге ваша конфигурация будет выглядеть так с вариантом №1:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
location /assets/images/ {
root /home/ankush/fu_main_files/;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 100;
}
location /ecwid_fu_scripts/ {
index index.php;
root /home/ankush/;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location / {
proxy_pass http://localhost:9001;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
}