Конфигурация Nginx с динамическим корнем для подпапкиPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Конфигурация Nginx с динамическим корнем для подпапки

Сообщение Anonymous »

Я пытаюсь написать конфигурацию Nginx для изменения нашей структуры каталога приложений. Я хочу иметь возможность поддерживать разработчиков, которые запускают как старую версию, так и новую версию в течение следующих нескольких лет. У нас также есть некоторые, к которым обращаются к конечной точке JavaScript, которая минифизирует (и кэши), но файлы доступны с использованием URL в форме http://example.com/oldsite/javascript.php/some/js/file.
Каждый экземпляр приложения находится внутри директора, например:
​​ Применение.

Код: Выделить всё

├── oldsite
│   ├── index.php
│   ├── javascript.php
│   ├── mod
│   │   └── book
│   │       └── index.php
│   └── r.php
└── newsite
   └── public
       ├── index.php
       ├── javascript.php
       ├── mod
       │   └── book
       │       └── index.php
       └── r.php
OldSite - это доступ по адресу http://example.com/oldsite/ и newsite по адресу http://example.com/newsite/.
Я стараюсь (и терпит неудачу), чтобы написать конфигурацию nginx, которая будет автоматически обрабатывать как старые, так и новые сайты. Что у меня есть до сих пор: < /p>

Код: Выделить всё

set $root /srv/sites
index index.php;

set $site "";
if ($uri ~ /(?[^/]+)(?/?.*)) {
set $site $site;
}

set $docroot "$root/$site";
if (-d "/$docroot/public") {
set $docroot "$root/$site/public";
}

location ~ /(?[^/]+)(?/.*\.php)(/?|$) {
root $docroot;
include /opt/homebrew/etc/nginx/blocks/php.conf;
}

location ~ ^/(?[^/]+)/?$ {
root $docroot;

rewrite ^(.*)/?$ $1/index.php last;

location ~ \.php$ {
include /opt/homebrew/etc/nginx/blocks/php.conf;
}
}

location ~ ^/(?[^/]+)/?(?.*)$ {
root $docroot;

location ~ \.php$ {
include /opt/homebrew/etc/nginx/blocks/php.conf;
}
try_files /$relpath /$relpath/ /r.php;
}
< /code>
my php.conf выглядит следующим образом: < /p>
fastcgi_split_path_info ^(.+\.php)(/.*)$;

# Save path_info before try_files resets it
set $path_info $fastcgi_path_info;

include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $docroot$relpath;
fastcgi_param DOCUMENT_ROOT $docroot;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index index.php;
< /code>
Что работает: < /p>
[list]
[*]http://example.com/oldsite< /code> (return /index.php)
[*]http://example.com/oldsite/< /code> (return /index.php)
[*]http://example.com/oldsite/index.php
[*]

Код: Выделить всё

http://example.com/oldsite/javascript.php/some/file
[*]

Код: Выделить всё

http://example.com/oldsite/mod/book/index.php
[*]

Код: Выделить всё

http://example.com/newsite< /code> (return /index.php)
[*]http://example.com/newsite/< /code> (return /index.php)
[*]http://example.com/newsite/index.php
[*]

Код: Выделить всё

http://example.com/newsite/mod/book/index.php
[*]

Код: Выделить всё

http://example.com/newsite/javascript.php/some/file< /code> < /li>
< /ul>
Что не работает: < /p>

http://example.com/oldsite/notfound< /code> (возвращает 404) - должен использовать /р.php
[*]http://example.com/oldsite/mod/book
(return 404) - должен использовать/mod/book/index.php
[*]

Код: Выделить всё

http://example.com/oldsite/mod/book/
(возвращает 404) - должен использовать/mod/book/index.php
[/list]
Копание в журналах используется окончательное соответствие местоположения (правильно), но директива try_files не работает, как я ожидаю.
try_files не работает.

Код: Выделить всё

2025/06/05 09:00:22 [debug] 80884#0: *31 generic phase: 13
2025/06/05 09:00:22 [debug] 80884#0:*31 try files handler
2025/06/05 09:00:22 [debug] 80884#0: *31 http script var: "/srv/sites/newsite/public"
2025/06/05 09:00:22 [debug] 80884#0:*31 http script copy: "/"
2025/06/05 09:00:22 [debug] 80884#0: *31 http script var: "mod/book/"
2025/06/05 09:00:22 [debug] 80884#0:*31 trying to use file: "/mod/book/" "/srv/sites/newsite/public/mod/book/"
2025/06/05 09:00:22 [debug] 80884#0: *31 http script copy: "/"
2025/06/05 09:00:22 [debug] 80884#0:*31 http script var: "mod/book/"
2025/06/05 09:00:22 [debug] 80884#0: *31 trying to use dir: "/mod/book/" "/srv/sites/newsite/public/mod/book/"
2025/06/05 09:00:22 [debug] 80884#0:*31 try file uri: "/mod/book/"
2025/06/05 09:00:22 [debug] 80884#0: *31 generic phase: 14
2025/06/05 09:00:22 [debug] 80884#0:*31 content phase: 15
2025/06/05 09:00:22 [debug] 80884#0: *31 content phase: 16
2025/06/05 09:00:22 [debug] 80884#0:*31 http script var: "/srv/sites/newsite/public"
2025/06/05 09:00:22 [debug] 80884#0: *31 open index "/srv/sites/newsite/public/mod/book/index.php"
2025/06/05 09:00:22 [debug] 80884#0:*31 internal redirect: "/mod/book/index.php?"
Я вижу, что он пытается использовать каталог, который он успешно находит, но затем это превращается во внутренний перенаправление, которое затем обрабатывается сверху, а сайт $ var превращается в mod , который затем не существует.

Код: Выделить всё

2025/06/05 07:00:29 [debug] 80884#0: *11 try files handler
2025/06/05 07:00:29 [debug] 80884#0: *11 http script var: "/srv/sites/newsite/public"
2025/06/05 07:00:29 [debug] 80884#0: *11 http script copy: "/"
2025/06/05 07:00:29 [debug] 80884#0: *11 http script var: "mod/book/notfound"
2025/06/05 07:00:29 [debug] 80884#0: *11 trying to use file: "/mod/book/notfound" "/srv/sites/newsite/public/mod/book/notfound"
2025/06/05 07:00:29 [debug] 80884#0: *11 http script copy: "/"
2025/06/05 07:00:29 [debug] 80884#0: *11 http script var: "mod/book/notfound"
2025/06/05 07:00:29 [debug] 80884#0: *11 trying to use dir: "/mod/book/notfound" "/srv/sites/newsite/public/mod/book/notfound"
2025/06/05 07:00:29 [debug] 80884#0: *11 trying to use file: "/r.php" "/srv/sites/newsite/public/r.php"
2025/06/05 07:00:29 [debug] 80884#0: *11 internal redirect: "/r.php?"
< /code>
он пытается и (правильно) не находит файл, а затем он (правильно) возвращается в /р. Я думал об использовании серии испытаний IF вместо тестирования IF 
, но это чувствует себя неправильно. Другим вариантом был бы какой -то прокси для директивы внутреннего сервера, я думаю?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/796 ... -subfolder
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»