我有一个现有的请求,看起来像
https://smth.ru/smth/GET_DATA?p_DATA_TYPE=arg1#arg2&arg2=XXX
我知道这非常不正确,但我必须接受它。而且它之前在 Apache 上也运行正常。
现在我需要 nginx 作为此请求的代理。但它只是丢弃了“#”后面的所有内容,而且我无法在任何变量(如 $query_string)中找到它
这就是为什么后端服务器只接收
https://smth.ru/smth/GET_DATA?p_DATA_TYPE=type
如何获取#后的参数或者进行nginx代理完整请求?
我的服务器块看起来像
server
{
...
location /
{
proxy_pass_header Authorization;
proxy_pass_request_headers on;
proxy_pass http://127.0.0.1:8080/$request_uri?$query_string;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
...
}
传递代理为
proxy_pass http://127.0.0.1:8080;
也没有效果。
尝试了包nginx.x86_64 0:1.6.2-23.el6.art
然后更新为nginx.x86_64 0:1.8.0-1.el6.ngx
-相同的效果...
更新:似乎 Apache 使用了整个请求,而 nginx 丢弃了# 之后的所有内容。
答案1
您的问题是浏览器甚至没有将片段标识符发送到服务器,因此即使 Nginx 愿意基于此进行重写,它也无法这样做,因为没有提供该信息。
我真的很好奇你之前的解决方案是如何与 Apache 配合使用的 - 我刚刚仔细检查了一下,我的 Firefox 没有在请求中发送片段标识符(根据数据包捕获)。也许你使用的浏览器的行为有所不同。
一个潜在的解决方案是逃脱通过 URL 编码来替换井号,使其变为%23
。您可以使用一些 Javascript 在页面加载时自动进行修改(检查片段标识符是否存在,如果存在,则将其转换为%23
并使用新 URL 刷新页面)。然后您需要根据该标识符而不是原始井号进行重写。