Nginx — местоположение с корнем в другом каталоге и переполнением стека

Я попытался установить местоположение, подобное «Псевдониму Apache» с Nginx, но я не могу обработать PHP-скрипт в этой папке.

Вот моя структура папок (для среды разработки):

/var/www
+-  dev/public/ <-- This is my normal Web root : "/"|   +- assets/
|   |  +- app.css
|   |  +- app.js
|   |
|   +-  index.php
|   +-  favicon.png
|
+-  cut/public/ <-- This must like an "Apache Alias" : "/cut"+- assets/
|  +- app.css
|  +- app.js
|
+-  index.php
+-  other_other_file.php (why not)

Я пробовал разные решения, но ни одно из них не работает.

Вот моя лучшая конфигурация Nginx:

server {
listen   80;

server_name _;
root  /var/www/dev/public/;
index index.php index.html;
autoindex on;

# Logs
rewrite_log on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;

# Serving files
location / {
try_files $uri $uri/ @php;
}

location /cut {
root /var/www/cut/public;
try_files $uri $uri/ @php;
}

# PHP
location @php {
rewrite ^(.*)/?$ /index.php$is_args$args last;
}

location ~* \.php(/|$) {
fastcgi_pass  php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

С этим, все содержание моего cut/public/ папка перенаправлена ​​на dev/public/index.php и интерпретировать (причина try_file, Я предполагаю).

Вот почему ваша помощь будет приветствоваться.

Окончательное решение

После ответа @ richard-smith вот реализованное решение:

server {
listen   80;

server_name _;
root  /var/www/dev/public/;
index index.php index.html;

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

location ^~ /cut {
rewrite ^/cut/?(.*)$ /cut/public/$1 last;
}

location ^~ /cut/public {
root /var/www/;
try_files $uri $uri/ /cut/index.php$is_args$args;

location ~* \.php(/|$) {
fastcgi_pass  php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

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

location ~* \.php(/|$) {
fastcgi_pass  php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

4

Решение

Для одновременного запуска двух PHP-приложений вам нужен либо общий корень документа, либо два location ~* \.php (или аналогичные) блоки для обеспечения правильного SCRIPT_FILENAME отправляется в бэкэнд fastcgi.

Использовать вложенные location блоки для изоляции /cut подкаталог, и используйте ^~ модификатор на верхнем уровне, чтобы избежать других регулярных выражений верхнего уровня location блоки от вмешательства (см. эта документация).

alias директива (см. эта документация) используется для карты /cut в /var/www/cut/public, root Директива может только объединить, что сделало бы /var/www/cut/public/cut (чего ты не хочешь).

Тем не менее, я бы не рекомендовал использовать alias директива с try_files директива из-за этот долгосрочный вопрос.

Таким образом, решение было бы переписать молча /cut в /cut/public и использовать значение root /var/www,

Например:

location ^~ /cut {
rewrite ^/cut(.*)$ /cut/public$1 last;
}
location ^~ /cut/public {
root /var/www;
try_files $uri $uri/ /cut/index.php$is_args$args;

location ~* \.php(/|$) {
fastcgi_pass  php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]