2014-02-28 2 views
1

내 앱이 이미 중복 된 쿼리 문자열을 하나의 URL에 추가하는 이유로 이상한 경우가 있습니다. 액세스 권한이 없거나 애플리케이션 코드를 파 낼 시간이 없지만 Nginx 구성에 액세스 할 수 있습니다.nginx에서 중복 쿼리 문자열 수정

내가 필요한 것은 중복 쿼리 문자열을 무시합니다 재 작성 규칙, 즉

http://foo.com?test=bar?test=barhttp://foo.com?test=bar

로 리디렉션됩니다이 가능하다조차입니까? 고맙습니다. 여기

답변

0

, 전에, 당신의 server 블록 내부에이를 추가 한 다른 location 또는 if :

if ($query_string ~ ^([^?]+)\?\1$) { 
    set $clean $1; 
    rewrite . $uri?$clean?; 
} 

약간 애매한 행동보다 더 있기 때문에 그것은, 제대로하는 것은 매우 까다로운 :

  • $query_string은 초기 값이없는 쿼리 문자열입니다. ?
  • 정규 표현식의 \1은 두 번째 복사본과 일치합니다. 후자는 원래의 쿼리 문자열의 복사본을 포함하고 있기 때문에 전자 첫 번째 그룹 (...)
  • 당신은, 재 당신이 재 작성에 $uri하지 $request_uri를 사용할 필요가
  • 을 덮어 쓰기 때문에 새로운 변수로 $1을 저장해야
  • 후행 ?을 다시 쓰기에 추가해야합니다. 그렇지 않으면 재 작성이 원래 쿼리 문자열의 복사본을 추가합니다!

합니다 (redirect 플래그없이) rewrite의 단순한 형태는 대부분의 응용 프로그램에 대한 충분해야한다 (즉, 이제까지, 아마 Nginx와 구문의 가장 모호한 비트의), 플러스 그것은에 대한 추가 왕복을 필요로하지 않습니다 브라우저.

당신을 위해 작동하지 않는 경우, 당신은 redirect 재 작성 플래그를 사용하여 브라우저 리디렉션을 발행, 최후의 수단으로 (예 : fastcgi_param QUERY_STRING와 같은) 적절한 백엔드 지시에 $clean 쿼리 문자열을 사용하거나 시도 할 수 있습니다.