【发布时间】:2015-04-25 09:32:18
【问题描述】:
我需要编写一个 nginx 位置指令来代理对子目录的请求到另一台服务器保留 urlencoding 和 删除子目录前缀。
这是一个人为的例子——这样的请求:
http://1.2.3.4/api/save/http%3A%2F%2Fexample.com
应该通过
http://abcd.com/save/http%3A%2F%2Fexample.com
我尝试了几种不同的方法。这是其中的几个:
-
location /api/ { rewrite ^/api(/.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://abcd.com; }
但它会解码字符串,所以http://abcd.com 得到/save/http://example.com
-
location /api/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://abcd.com; }
但它保留子目录,所以http://abcd.com 得到/api/save/http%3A%2F%2Fexample.com。
需要的是中间的某个地方。谢谢!
UPD:这是 nginx 错误跟踪器中的 ticket
【问题讨论】:
-
你可以试试 lua。但首先你不应该需要这个,根据 http 规范,这些 url 是相同的
-
或者使用子域代替子目录
-
@AlexeyTen 在
http://abcd.com上运行的服务器正在以不同的方式处理这些请求,我无法控制它。你知道那个 http 规范摘录的链接吗?我找不到它 -
RFC 2616 第 3.2.3 节
-
@AlexeyTen 它说 “保留”和“不安全”集(参见 RFC 2396 [42])中的字符以外的字符等效于它们的“”%“HEX HEX”编码。 我不知道 RFC 2396 中的
[42]是什么,但 RFC 中的第 2.2 节说这些字符是保留的 —";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
标签: nginx