Nginx 丢弃数字符号(#)后的数据

Nginx 丢弃数字符号(#)后的数据

我有一个现有的请求,看起来像
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 刷新页面)。然后您需要根据该标识符而不是原始井号进行重写。

相关内容