Nginx работает на порте 80, и я использую его для реверсирования URL прокси с путем /foo
к порту 3200
следующим образом:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Это работает нормально, но у меня есть приложение на порт 3200
, для которого я не хочу /foo
отправлять инициалы. То есть - когда я получаю доступ http://localhost/foo/bar
, я хочу /bar
быть тем путем, который получит приложение. Поэтому я попытался добавить эту строку в блок местоположения выше:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Это вызывает 302 редирект (изменение в URL), но я хочу 301. Что мне делать?
nginx
reverse-proxy
301-redirect
jeffreyveon
источник
источник
Ответы:
Любое перенаправление на localhost не имеет смысла с удаленной системы (например, веб-браузера клиента). Таким образом, флаги перезаписи перманент (301) или перенаправление (302) в вашем случае непригодны.
Пожалуйста, попробуйте выполнить следующие настройки, используя прозрачное правило перезаписи:
Используйте,
curl -i
чтобы проверить ваши переписывает. Очень тонкое изменение правила может привести к тому, что nginx выполнит перенаправление.источник
/foo(.*)
, иначе неexample.com/foo
будет совпадать. (что, вероятно, пережил Джеффривеон)Простое сопоставление префиксов местоположения работает для этого без использования правила перезаписи, если вы указали URI в директиве proxy_pass:
Обратите внимание на дополнительное
/
в концеproxy_pass
директивы. NGINX удалит соответствующий префикс/foo
и передаст остаток на внутренний сервер по URI/
. Поэтомуhttp://myserver:80/foo/bar
будет публиковать в бэкэнд наhttp://localhost:3200/bar
.Из документов NGINX на proxy_pass :
источник
//xyz
хосту, если вы это сделаете.Абсолютно самый правильный путь и лучшая практика обычно таковы:
Обратите внимание на крайнюю важность конечной косой черты
proxy_pass
, которая автоматически изменяет$uri
переменную, чтобы она/foo/
соответствовала/
на внешнем интерфейсе на внутреннем. Нет необходимости в явнойrewrite
директиве.Кроме того, обратите внимание, что также очень важен трейлинг
/
вlocation
- без него вы рискуете иметь странные URL на вашем сайте в один момент (например, работать/fooen
в дополнение к/foo/en
).Кроме того, трейлинг
/
вlocation
withproxy_pass
также обеспечивает некоторую особую обработку в соответствии с документациейlocation
директивы, чтобы эффективно вызывать и неявноеlocation = /foo {return 301 /foo/;}
.Таким образом, определяя a
location
с помощью завершающей косой черты, как указано выше, вы не только гарантируете, что URL-адреса с суффиксами без косой черты, например/fooen
, не будут действительными, но также и то, что/foo
без завершающей косой черты будет также работать.Справочная документация:
источник
$args
, потерялись:http://frontend/foo?bar=baz
будут прокси наhttp://backend/
. Обратите внимание, что арги не являются частью URL$args
что все равно следует обращаться надлежащим образом, если вы используете приведенный выше код, поскольку они отделены от$uri
и должны быть собраны обратно, если только вы не используете явные переменные в своемproxy_pass
./foo
перенаправления/foo/
, поэтому, если вы не делаете что-то странное в бэкэнде, даже/foo
запросы будут работать с приведенным выше кодом. (Это на самом деле уже часть ответа, кстати.)пытаться
или же
источник
//xyz
хосту, если вы это сделаете.@Terabuck Извините, что не ответил ни одного представителя еще.
Вы не должны использовать localhost, потому что вы зависите от того факта, что приложение работает на сервере с файлом hosts. локальный хост - это только перевод по умолчанию на 127.0.0.1. Ничто не говорит о том, что у вас должны быть эти файлы хостов. Просто очень часто есть один.
Наличие интерфейса с обратной связью - это еще одна распространенная вещь, от которой зависит зависимость, но вы все еще зависите от интерфейса с обратной связью в сетевом стеке. Это редкий случай не иметь эти два. Если вы когда-нибудь беспокоитесь об этом. По крайней мере, в Unix / Linux у вас есть возможность для сокетов. Это исключит необходимость того, чтобы сетевой стек достиг локального хоста. Будьте осторожны с этим подходом, так как в хост-системе появятся несколько факторов. Например, количество открытых файлов и т. Д.
источник