我正在尝试在我的proxy_pass上包含$remote_addr或$http_remote_addr,但没有成功。
重写规则起作用
location ^~ /freegeoip/ {
rewrite ^ http://freegeoip.net/json/$remote_addr last;
}不带$remote_addr的proxy_pass可以工作,但freegeoip不能读取x-Real-IP
location ^~ /freegeoip/ {
proxy_pass http://freegeoip.net/json/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}然后,我将ip添加到请求的末尾,如下所示:
location ^~ /freegeoip/ {
proxy_pass http://freegeoip.net/json/$remote_addr;
}但是nginx报告这个错误:没有定义解析器来解析freegeoip.net
发布于 2014-03-08 03:33:47
如果proxy_pass语句中没有变量,那么它将在启动或重新加载期间使用"gethostbyaddr“系统调用,并永久缓存该值。
如果有任何变量,例如使用以下任一变量:
set $originaddr http://origin.example.com;
proxy_pass $originaddr;
# or even
proxy_pass http://origin.example.com$request_uri;然后nginx将使用内置的解析器,并且必须存在" resolver“指令。“解析器”可能用词不当;可以把它理解为“内置解析器将使用什么DNS服务器”。从nginx 1.1.9开始,内置解析器将支持DNS TTL值。在此之前,它使用了5分钟的固定值。
发布于 2013-07-23 17:03:46
nginx无法在运行时而不是配置时解析域名,这似乎有点奇怪(因为域名是硬编码的)。将resolver声明添加到location块通常可以修复运行时遇到的问题。因此,您的位置块可能如下所示:
location ^~ /freegeoip/ {
#use google as dns
resolver 8.8.8.8;
proxy_pass http://freegeoip.net/json/$remote_addr;
}这个解决方案是基于我前段时间读到的一篇文章- Proxy pass and resolver。值得一读。
发布于 2017-12-25 22:17:32
如果有人遇到麻烦,对我来说,将proxy_pass主机移到一个单独的上游是有帮助的,所以我想出了这样的方法
upstream backend-server {
server backend.service.consul;
}
server {
listen 80;
server_name frontend.test.me;
location ~/api(.*)$ {
proxy_pass http://backend-server$1;
}
location / {
# this works mystically! backend doesn't...
proxy_pass http://frontend.service.consul/;
}
}https://stackoverflow.com/questions/17685674
复制相似问题