按照这篇文章,我可以成功手动加载端口。例如,使用以下 nginx.conf:
location /port {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass http://localhost:5001;
}
如果我想重定向和端口范围 (5001-5228),我必须手动创建位置。为了避免这种情况,我想使用正则表达式方法捕获端口号。
我尝试的是以下:
location ~^/port/(.*)$ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass http://localhost:$1;
add_header X-debug-message "input: $1" always;
add_header X-debug-message-2 "request_uri: $request_uri" always;
add_header X-uri "uri: $uri" always;
}
我从这个实现中得到的响应标头是:
Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: /port/5002
error 4512#4512: \*1 no resolver defined to resolve localhost
这篇文章
我将解析器设置为 0.0.0.0、127.0.0.1 以及 /etc/resolv.conf 显示的内容
但要么不返回解析器,要么 *1 localhost could not be resolved (110: Operation timed out)
location ~^/port/(.*)$ /{
...
rewrite /port/(.\*) $1 break;
set $upstream http://localhost:$1;
proxy_pass $upstream;
}
返回:
Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: 5002
error 4638#4638: \*5 invalid URL prefix in ""
location ~^/port/(?<port>\d+)/(.*)$ {
resolver 127.0.0.1;
set $upstream "http://127.0.0.1:$port";
proxy_pass $upstream/$2$is_args$args;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
我学到的东西是通过位置 (?<port>\d+)
分配 $port 变量,并使用你的 uri 创建一个后端字符串。然后代理传递该后端变量。通过将解析器移动到位置块中解决了解析器问题。