Сопоставление местоположения NGINX после переписывания ... Последнее: Почему вложенное местоположение выбирается над глоPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Сопоставление местоположения NGINX после переписывания ... Последнее: Почему вложенное местоположение выбирается над гло

Сообщение Anonymous »

Я пытаюсь понять точную логику соответствия местоположения в Nginx после внутреннего перенаправления, вызванного перезапись ... последний . Моя цель - подавать совершенно отдельное применение от подкаталогера () Использование псевдоним .
Вот моя минимальная, воспроизводимая конфигурация:

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

server {
# The 'main' project's document root
root /var/www/main/public;

location /app {
# The 'app' project is served from a completely different path
alias /var/www/app/public;
try_files $uri $uri/ @app_rewrite;

# Nested PHP handler for the 'app' project
location ~ \.php$ {
# ... FastCGI settings ...
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}

location @app_rewrite {
rewrite ^/app(.*)$ /app/index.php?$1 last;
}

# Global PHP handler for the 'main' project
location ~* \.php$ {
# ... FastCGI settings ...
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
Когда выполняется запрос на https://example.com/app/some/path , он правильно переписывается в /пп/index.php.
Основной вопрос: после переписывания , который из -за того, что из -за того, что точнее, точное. Выбор? < /p>
1. Мое исследование и первоначальное ожидание
На основе документированных правил приоритета Nginx (Regex ~ имеет более высокий приоритет, чем префикс/), я ожидал, что следующее:
  • Постановка URI/upapp/Index.php
    /> будет выбран Global Location ~* \ .php $ , потому что местоположения REGEX выигрывают над местоположениями префикса, таких как/App.
  • Это должно было привести к ошибке, поскольку глобальное местоположение использует корень , и файл не существует в /var/www/main/public/app/index.php.
Я также подтвердил это ожидание с помощью онлайн -тестеров местоположения, что все указывало на то, что глобальный блок Regex должен быть окончательным матчем. Фактическое (и удивительное) поведение
Вопреки моим ожиданиям, приложение работало отлично . Это означает, что сценарий PHP из пута псевдоним (

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

/var/www/app/public/index.php
) выполнялся, что подразумевает вложенное местоположение ~ \ .php $ inside/app каким -то образом выбрано.
3. Окончательный эксперимент
Чтобы доказать это, я запустил тест:

[*] Я прокомментировал все вложенное местоположение ~ \ .php $ block.
I Reloaded nginx. думал, что глобальный блок использовался в любом случае). Вместо этого запрос немедленно начал возвращать ошибку 404 . Я не понимаю внутреннюю логику NGINX, которая позволяет вложенному местоположению быть приоритетным в сценарии с более высоким приоритетом в этом конкретном перезаписи ... Последний сценарий.
среда

nginx версия: nginx/1.18.0 (ubunt>

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

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

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

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

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

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