С nginx, как перенаправить параметры запроса?
upstream apache {
server 127.0.0.1:8080;
}
server{
location ~* ^/service/(.*)$ {
proxy_pass http://apache/$1;
proxy_redirect off;
}
}
Выше фрагмент будет перенаправлять часть запросов внутри этого URL-адреса, включая строку "service" на другой сервер, но не включает параметры запроса.
Ответы
Ответ 1
Из proxy_pass документация:
В специальном случае используются переменные в инструкции proxy_pass: запрошенный URL не используется, и вы несете полную ответственность за создание целевого URL самостоятельно.
Поскольку вы используете $1 в цели, nginx полагается на вас, чтобы точно сказать, что передать. Вы можете исправить это двумя способами. Во-первых, зачистка начала uri прокси-байтом тривиальна:
location /service/ {
# Note the trailing slash on the proxy_pass.
# It tells nginx to replace /service/ with / when passing the request.
proxy_pass http://apache/;
}
Или, если вы хотите использовать расположение регулярных выражений, просто включите args:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
Ответ 2
Я использую слегка измененную версию второго подхода kolbyjack с ~
вместо ~*
.
location ~ ^/service/ {
proxy_pass http://apache/$uri$is_args$args;
}
Ответ 3
Я изменил код @kolbyjack, чтобы он работал для
http://website1/service
http://website1/service/
с параметрами
location ~ ^/service/?(.*) {
return 301 http://service_url/$1$is_args$args;
}
Ответ 4
вам нужно использовать rewrite для передачи параметров с помощью proxy_pass
вот пример, который я сделал для развертывания приложения angularjs для s3
S3 Статический хостинг веб-хостинга Все пути к Index.html
принятый для ваших нужд, будет что-то вроде
location /service/ {
rewrite ^\/service\/(.*) /$1 break;
proxy_pass http://apache;
}
если вы хотите закончить http://127.0.0.1:8080/query/params/
если вы хотите закончить в http://127.0.0.1:8080/service/query/params/
вам понадобится что-то вроде
location /service/ {
rewrite ^\/(.*) /$1 break;
proxy_pass http://apache;
}
Ответ 5
github gist https://gist.github.com/anjia0532/da4a17f848468de5a374c860b17607e7
#set $token "?"; # deprecated
set $token ""; # declar token is ""(empty str) for original request without args,because $is_args concat any var will be `?`
if ($is_args) { # if the request has args update token to "&"
set $token "&";
}
location /test {
set $args "${args}${token}k1=v1&k2=v2"; # update original append custom params with $token
# if no args $is_args is empty str,else it "?"
# http is scheme
# service is upstream server
#proxy_pass http://service/$uri$is_args$args; # deprecated remove `/`
proxy_pass http://service$uri$is_args$args; # proxy pass
}
#http://localhost/test?foo=bar ==> http://service/test?foo=bar&k1=v1&k2=v2
#http://localhost/test/ ==> http://service/test?k1=v1&k2=v2
Ответ 6
Для перенаправления Без строки запроса добавьте ниже строки в блок сервера в строке порта прослушивания
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/;
}
С строкой запроса
if ($uri ~ .*.containingString$) {
return 301 https://$host/$uri/?$query_string;
}