Как я могу найти базовый URL приложения за прокси? - PullRequest
1 голос
/ 09 февраля 2020

Наше приложение PHP (на заказ, без фреймворка) иногда должно использовать свой базовый полный URL (например, для хранения URL в файлах, отправляемых клиентам). На основании, например, этого вопроса наше приложение догадывается об этом (это основано на сравнении __FILE__ и различных переменных в $SERVER, таких как SCRIPT_NAME и SERVER_NAME).

Сейчас нам нужно настроить (nginx) обратный прокси-сервер перед нашим приложением. Предположим, что мы сопоставляем https://example.com/some/dir/onproxy/ с http://backend/another/dir/onbackend/.

Есть ли способ угадать URL-адрес publi c (https://example.com/some/dir/onproxy/) из кода на backend?

AFAIU (из моих чтений и экспериментов), это невозможно (HTTP_HOST может дать example.com, но я не нашел ничего, что указывает на some/dir/onproxy), но, возможно, я что-то упускаю (некоторые переменные или параметр конфигурации nginx).

Есть идеи?

Если это невозможно, единственное решение - сохранить https://example.com/some/dir/onproxy/ в конфигурации, верно?

РЕДАКТИРОВАТЬ 1

Как подсказал @Progman, я попробовал решения по этому вопросу . Я пробовал как принятый ответ, так и второй по популярности ответ, но оба возвращают (в некоторых вариациях) URL-адрес на бэкэнд (http://backend/another/dir/onbackend/).

РЕДАКТИРОВАТЬ 2

Я забыл упомянуть, что не хотел бы полагаться на перезапись URL в прокси.

1 Ответ

1 голос
/ 11 февраля 2020

Поскольку Nginx изменяет запрос до того, как он достигнет PHP, решение состоит в том, чтобы каким-либо образом добавить исходные данные запроса в прокси-запрос.

Обычно используется следующее соглашение: добавить исходные данные в качестве дополнительных заголовков HTTP. См. X_Forwarded_For в качестве примера этого.

Чтобы добавить исходный путь запроса в качестве нового заголовка, добавьте директиву proxy_set_header к Nginx.

location /some/dir/onproxy/ {
    rewrite ^/some/dir/onproxy/(.*)$  /another/dir/onbackend/$1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Request-URI $request; #** This adds the original path as a header **
    proxy_set_header Host $http_host; # **Optional, will retain the original host name**
    proxy_pass http://backend;
}

Что-то похожее на то, что в вашей конфигурации, будет перенаправлять исходный запрос на PHP веб-сервер на внутреннем сервере. Предполагается, что сервер является HTTP-сервером, а не PHP -FPM.

В PHP самый быстрый способ получить значение одного HTTP-заголовка - через $ _ SERVER . Исходный путь запроса будет в $_SERVER['HTTP_X_REQUEST_URI'].

Это всего лишь пример, вам может потребоваться протестировать и отладить приложение, чтобы уточнить решение. php_info () ; Это полезный инструмент отладки для среды PHP, однако он также будет полезен для злоумышленников, поэтому удалите его из своего кода как можно скорее или примите другие меры, чтобы он не был раскрыт.

...