2016-08-18 4 views
0

수신하는 쿼리 문자열을 전달해야하는 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.인가 거기 이렇게하는 더 강력한 방법?

+0

백엔드에서 중괄호가있는 URI를 처리하는 것이 왜 문제인지 이해할 수 없습니다. 그게 진짜 문제인지 확신 할 수 있니? – cnst

+0

백엔드 서버는 dropwizard (http://www.dropwizard.io/) 프레임 워크를 사용합니다. 수신하는 쿼리 문자열을 구문 분석 할 때 URISyntaxException을 발생시킵니다. 나는 그것이 내 통제 밖에서 일어나는 것처럼 보이는 것처럼 이것을 잡는 길을 찾을 수 없다. 가장 간단한 해결 방법은 웹 서버에 도달하기 전에 쿼리 문자열을 수정하는 것입니다. – theChumpus

답변

0

개인적으로는 매우 가독성, 유연성 또는 유지 관리가 가능하지 않으므로 개인적으로 단일 if 문을 사용하는 솔루션이 마음에 들지 않습니다. location 또는 rewrite 문을 포함하고 있는지 여부를 확인할 수 있습니다. 각 문은 특정 인코딩 케이스를 처리하지만 작동 할 수 있습니다. http://mdoc.su/을 참조하십시오. 내부 리디렉션과 함께 매우 무거운 프로젝트입니다. 비록 nginx가 전체 회귀 수를 제한 할 수 있다고 생각합니다.

그렇지 않으면 백엔드를 수정할 수 없다는 점을 제외하면 올바르지 않은 클라이언트 및/또는 요청을 보조 백엔드로 자동 리디렉션하는 것입니다.이 목적은 문자열을 올바르게 다시 인코딩하는 것이고 X-Accel-Redirect HTTP 응답 헤더를 다음과 같이 제공합니다. 그 출력 (http://nginx.org/r/proxy_ignore_headers에 따라), nginx는 실제 백엔드에 후속 내부 리디렉션/요청을 만드는 데 사용됩니다.