Я попытался установить местоположение, подобное «Псевдониму 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;
}
}
Для одновременного запуска двух 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;
}
}
Других решений пока нет …