我有现在的请求,看起来像
https://smth.ru/smth/GET_DATA?p_DATA_TYPE=arg1#arg2&arg2=XXX
我知道这是非常不正确的,但我必须与它合作。 它和Apache一起工作。
现在我需要nginx作为这个请求的代理。 但它简单地丢弃了“#”后面的所有内容,而且在$ query_string之类的variables中找不到它
这就是为什么后端服务器只接收
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 – 相同的效果…
UPD:似乎Apache使用整个请求,而nginx丢弃#后的所有内容。
你的问题是,浏览器甚至不会将片段标识符发送到服务器,所以即使Nginx愿意重写,它也不能这样做,因为它没有提供这个信息。
我真的好奇你以前的解决scheme如何与Apache工作 – 我只是加倍检查,我的Firefox不发送请求中的片段标识符(根据数据包捕获)。 也许无论你使用的浏览器有什么不同的performance。
一个潜在的解决scheme是通过URL编码来转义散列字符,这使得它成为%23 。 您可以使用一些Javascript在页面加载时自动进行修改(检查是否存在片段标识符,如果存在,则将其转换为%23并使用新的URL刷新页面)。 然后你需要重写,而不是原来的哈希字符。