В Nginx мы пытались перенаправить URL следующим образом:
http://example.com/some/path -> http://192.168.1.24
где пользователь все еще видит исходный URL в своем браузере. Как только пользователь будет перенаправлен, скажем, он щелкнет ссылку /section/index.html
, мы бы хотели, чтобы он отправил запрос, который приведет к перенаправлению
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
и снова сохраняем исходный URL.
В наших попытках использовались различные решения, использующие прокси-серверы и правила перезаписи, и ниже показана конфигурация, которая приблизила нас к решению (обратите внимание, что это конфигурация веб-сервера для example.com
веб-сервера). Тем не менее, есть еще две проблемы с этим:
- Он не выполняет перезапись должным образом, поскольку URL-адрес запроса, полученный веб-сервером,
http://192.168.1.24
содержит/some/path
и, следовательно, не обслуживает требуемую страницу. При наведении на ссылку, когда страница обслуживается,
/some/path
отсутствует в URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Мы ищем решение, которое включает только изменение конфигурации веб-сервера example.com
. Мы можем изменить конфигурацию 192.168.1.24
(также Nginx), однако мы хотим попытаться избежать этого, потому что нам нужно будет повторить эту настройку для сотен различных серверов, доступ к которым осуществляется через прокси example.com
.
root
внутриlocation
блока, тогда вы не получите неожиданного поведения для местоположений по умолчанию. Только если вам нужно изменить настройкиroot
по умолчанию для каждого местоположения, тогда вы можете использовать его.Вы должны использовать часть URI в
proxy_pass
директиве. Кроме того, вы перепутали порядок аргументовproxy_redirect
директивы, и, вероятно, вам это вообще не нужно. Nginx имеет разумное значение по умолчанию для этой директивы.В этом случае ваш
location
блок может быть очень простым:источник
/some/path/
часть URL-адреса сохраняется в запросе, который не является действительным URL-адресом (для его удаления нам также необходимо переписать URL-адрес).Вы можете использовать следующую конфигурацию, чтобы иметь 100% бесшовное сопоставление между
/some/path/
интерфейсом и/
бэкэндом.Обратите внимание, что пока это единственный ответ, который также беспрепятственно позаботится об абсолютных путях, генерирующих
404 Not Found
ошибки, при условии, чтоReferer
браузер отправляет правильный HTTP- заголовок, поэтому все эти картинки должны продолжать загружаться без какой-либо необходимости изменять базовый HTML. (что не только дорого, но и не поддерживается без дополнительных модулей, не скомпилированных по умолчанию).Вы можете найти полный проверочный концепт и минимально жизнеспособный продукт в репозитории https://github.com/cnst/StackOverflow.cnst.nginx.conf .
Вот тестирование, чтобы подтвердить, что все крайние случаи, кажется, работают:
PS Если у вас есть много различных путей к карте, то вместо того , чтобы делать регулярные выражения сравнения в
$http_referer
пределах вif
пределахlocation @404
, вы можете захотеть использовать глобальный основеmap
директивы вместо этого.Также обратите внимание, что завершающие косые черты как в
proxy_pass
, так и в том виде, в которомlocation
он содержится, весьма важны в соответствии с соответствующим ответом .Рекомендации:
источник
Когда эта косая черта добавляется в прокси-сервер nginx, у вас появляется сообщение «Похоже, что ваш обратный прокси-сервер сломан».
Следует читать
источник