수신하는 쿼리 문자열을 전달해야하는 nginx 역 프록시가 있습니다. 그러나이 쿼리 문자열의 형식이 올바르지 않으며 URL 인코딩되지 않은 JSON을 포함 할 수 있습니다. 즉 {}, 쉼표, 콜론 및 큰 따옴표 중괄호가 포함되어 있습니다. 불행히도, 나는 이것에 대해 아무런 통제력이 없기 때문에 문자열을 파싱 할 때 다운 스트림 서버가 barf가됩니다.nginx - URL 인코딩 쿼리 문자열
프록시하기 전에이 문자열을 올바르게 URL 인코딩하는 방법이 있습니까?
나는 각 사용하여 설정의 하나 개의 인스턴스가있을 것입니다 알고 내가 중괄호를 대체 할 수
if ($args ~* '(.*){(.*)}(.*)') {
set $args $1%7B$2%7D$3;
rewrite (.*)$ $1;
}
proxy_pass http://127.0.0.1:8080;
그러나, 나는이 JSON 그래서 그것의가 얼마나 많은 분야 사전에 모르는 객체의 나머지 부분에 대해 위와 같은 논리를 사용하기가 어렵습니다.
나는 proxy_pass에서 URI를 사용하지 않기 때문에 이것이 nginx URL 디코딩 매개 변수와 관련이 없다고 언급해야합니다.
감사합니다.
업데이트 : 당분간 JSON 객체는 동일한 속성을 전송하는 것으로 보입니다. 따라서 이것이 해결 방법으로 사용되었습니다. 그것은 꽤 끔찍하고 속성의 수가 바뀌면 부서 지지만 현재는 그 일을합니다. 이 9 개 이상 정규식 그룹을 반환하기 때문에, 내가 10, 11, 12, 그렇지 않으면 $ 1 + 숫자 0으로 해석 얻을 이름 그룹에 있다고
if ($args ~* '(.*){"(.*)":"(.*)","(.*)":"(.*)","(.*)":"(.*)","(.*)":"(.*)","(?<group10>.*)":"(?<group11>.*)"}(?<group12>.*)') {
set $args $1%7B%22$2%22%3A%22$3%22%2C%22$4%22%3A%22$5%22%2C%22$6%22%3A%22$7%22%2C%22$8%22%3A%22$9%22%2C%22${group10}%22%3A%22${group11}%22%7D${group12};
rewrite (.*)$ $1;
}
proxy_pass http://127.0.0.1:8080;
참고 1
2.인가 거기 이렇게하는 더 강력한 방법?
백엔드에서 중괄호가있는 URI를 처리하는 것이 왜 문제인지 이해할 수 없습니다. 그게 진짜 문제인지 확신 할 수 있니? – cnst
백엔드 서버는 dropwizard (http://www.dropwizard.io/) 프레임 워크를 사용합니다. 수신하는 쿼리 문자열을 구문 분석 할 때 URISyntaxException을 발생시킵니다. 나는 그것이 내 통제 밖에서 일어나는 것처럼 보이는 것처럼 이것을 잡는 길을 찾을 수 없다. 가장 간단한 해결 방법은 웹 서버에 도달하기 전에 쿼리 문자열을 수정하는 것입니다. – theChumpus