nginx переписывает запросы на удаление неизвестных путей - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть приложение, работающее в Docker-контейнере (webdevops / php-nginx), которое думает, что оно запускается по корневому пути, например:

http://localhost:8000/index.php

Перед приложением я запускаю внешнийбалансировщик нагрузки и предоставление каждому приложению отдельного URI-пути на том же хосте, например:

http://localhost/app1/index.php should use the backendserver at http://localhost:8000

Когда запрос поступит в мое приложение, он будет http://localhost:8000/app1/index.php,, но я хочу, чтобы мойnginx для удаления / app1 / part (первый сегмент пути).Я не буду знать заранее содержимое сегмента пути.

В следующей таблице приведены некоторые примеры:

+------------------------------------------------_+----------------------------+--------------+-----------------------+
|                  Incoming URL                   |         File tried         | File exists? |       File used       |
+------------------------------------------------_+----------------------------+--------------+-----------------------+
| http://localhost:8000/                          | /index.php                 | N            | /index.php            |
| http://localhost:8000/app1/                     | /app1/index.php            | N            | /index.php            |
| http://localhost:8000/css/base.css              | /css/base.css              | Y            | /css/base.css         |
| http://localhost:8000/app1/edit.php             | /app1/edit.php             | N            | /edit.php             |
| http://localhost:8000/app1/css/base.css         | /app1/css/base.css         | N            | /css/base.css         |
| http://localhost:8000/app1/foo/bar/css/base.css | /app1/foo/bar/css/base.css | N            | /foo/bar/css/base.css |
+------------------------------------------------_+----------------------------+--------------+-----------------------+

Я попробовал следующую конфигурацию:

/opt / docker / etc / nginx / vhost.common.d / 10-location-root.conf

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/([^/]+/)(.*)$ {
        try_files $uri $uri/ /$2 /index.php?$query_string;

/ opt / docker / etc / nginx / conf.d / 10-php.conf

upstream php {
    server 127.0.0.1:9000;
}

/ opt / docker / etc / nginx / vhost.common.d / 10-php.conf

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME     $request_filename;
    fastcgi_read_timeout 600;
}

и работает для обслуживания статических файлов, но любые PHP-файлы обслуживаютсяВторой оператор определения местоположения перестал работать.

Я уверен, что есть тривиальное решение, но сейчас я немного озадачен.

1 Ответ

0 голосов
/ 30 сентября 2019

Итак, я нашел возможное решение, добавив второй оператор местоположения, который, кажется, делает то, что я хочу:

/ opt / docker / etc / nginx / vhost.common.d / 10-location-root.conf

location / {
    try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/([^/]+)(/.*\.php)$ {
        fastcgi_split_path_info ^/(?:[^/]+)/(.+\.php)(/.+)$;
        fastcgi_pass php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME     $document_root$2;
        fastcgi_read_timeout 600;
}
location ~ ^/([^/]+/)(.*)$ {
        try_files $uri $uri/ /$2 /index.php?$query_string;
...