我有一个简单的nginx转发代理,配置为:
server {
listen 8000;
resolver 8.8.8.8;
location / {
set_unescape_uri $url $arg_url; # obtain the decoded request
# rewrite $request_uri $url;
# set $request_uri $url; # won't work, not writeable
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
请注意,set_unescape_uri
指令需要Nginx Set Misc module。
如果未对客户端进行防火墙,则服务器可以正常工作,服务器记录连接的方式如下:
GET http://www.example.com/ HTTP/1.1
但是,如果客户端位于防火墙后面,则发送到代理服务器的请求如下所示:
GET http://www.clientfirewall.com/path/rewrite.do?url=http%3A%2F%2Fwww.example.com HTTP/1.1
很明显,防火墙做了两件事:
$request_uri
进行编码,并且$request_uri
前面加上前缀。所以我的任务是撤销他们的工作,即删除前缀并将已解码的请求发送到代理。我的第一个尝试(上面的两行注释是)用解码后的值$request_uri
重新填充了变量$url
,然后我意识到变量$request_uri
是内置的nginx,因此不可写。
我的第二个尝试是使用重写规则,然后我了解到规则处理URL的路径部分,无法更改http://www.clientisp.com
部分。
我无法选择吗?还有解决方法,将更改后的$request_uri
发送到上游代理服务器?
编辑:为简洁起见,将这个问题重写了。