매개 변수가있는 URL에 대한 nginx 다시 쓰기


16

이 유형의 URL이 있습니다.

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

그리고 이것을 이것을 다음으로 리디렉션하고 싶습니다 :

http://www.example.com/newparam/val3/val4

그래서 나는이 재 작성 규칙을 성공하지 않고 시도했습니다.

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

nginx는 쿼리 매개 변수를 처리 할 수 ​​없습니까?

편집 : 모든 청원을 다시 작성하고 싶지 않습니다. 다른 URL에는 영향을주지 않고 해당 URL 만 다시 작성하면됩니다.

답변:


15

좋아, rzab의 초기 도움 덕분 에이 작업 솔루션에 대한 그의 규칙을 재정의했습니다.

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

무한 재귀를 피하기 위해 조건을 추가하고? 규칙의 끝에 초기 매개 변수를 제거하십시오 . 그것은 완벽하게 작동합니다 :)


1
쿼리 문자열은 다른 순서의 매개 변수를 허용합니다. 따라서 if예를 들어 param2갈 때 작업이 중지됩니다 param1.
Alexander Azarov

흥미 롭군 필자의 경우 전자 메일에서 클릭 가능한 URL이기 때문에 발생하지 않지만 알아 두는 것이 좋습니다. 감사.
David Morales

4
위치 = / {
  다시 쓰기 ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

따라서 $ arg_와 매개 변수 이름을 써야합니까?
David Morales

예, 가장 쉬운 방법입니다.
Martin Fjordvald

좋아, 그러나 나는 모든 청원을 다시 쓰고 싶지 않다. 다른 URL에는 영향을주지 않고 해당 URL 만 다시 작성하면됩니다.
David Morales

몇 가지 테스트를했습니다. 이 규칙은 무한 리디렉션을 생성합니다. 나는 내가 일 해야하는 코드로 새로운 대답을 쓸 것이다. 감사합니다 :)
David Morales

재귀를 피하기 위해 "location = /"외에 "location /"를 선언해야한다는 것을 언급해야 할 것입니다. 메인 경로로 proxy_pass 어딘가에 있다고 생각합니다. "location = /"는 정확히 / 요청과 일치합니다. 그것은 일치하는 것을 제외하고 어쨌든, $ 인수를 일치하면 확인을 보인다 모든 매개 변수와 요청을 PARAM1 = VAL1 & ...?
rzab
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.