2017-12-15 3 views
1

일부 매개 변수를 제거 :의 nginx 리턴 (301) 내가 일부 매개 변수가</em> 사용의 nginx 내가 URL은 다음과 같이 재 지정하려면 예를 들어 301</p> <p>을 반환 <em>을 제거하기 위해 노력하고있어

https://www.example.com/one?wanted=1&unwanted1=1 ->https://www.example.com/one?wanted=1

https://www.example.com/one?unwanted1=1 ->https://www.example.com/one

https://www.example.com/one?unwanted1=1&unwanted2=2&unwanted3=3 ->https://www.example.com/one

,

... 그래서

에 나는 (주의 대신 수익의 재 작성 사용)이 코드 몇 가지 실험을했다 : 원치 않는 매개 변수 중 하나만이있을 때

if ($request_uri ~ "([^\?]*)\?(.*)unwanted=([^&]*)&?(.*)") { 
    set $args $2$4; 

    rewrite "^" $scheme://$host$uri permanent; 
} 

이 잘 작동합니다.

각 매개 변수에 대해 반복하려고했으나 이제는 여러 번의 리디렉션을 수행하고 더 이상 필요하지 않은 경우 (단지 하나의 arg 만 남았 음) "&"을 정리하지 않으므로 최적의 방식으로 작동하지 않습니다.

... 또한 나는 이런 종류의 상황에서 선호되는 방법이라고 생각하기 때문에 재 작성 대신 반품 301을 사용하는 것을 선호합니다. 301을 반환하기 위해 마지막 줄을 적용하려고 시도했지만 나에게 적합하지 않았습니다.

어떻게하면 올바르게 수행 할 수 있습니까?

+0

[nginx 301 리다이렉트 (질의 문자열 포함)] 가능한 복제본 (https://stackoverflow.com/questions/40810219/nginx-301-redirect-with-query-string) –

+0

나는 당신이 질문을 수정하십시오 (어떤 이유로 알림이 누락되었습니다). 나는 이것에 대해 다시 한번 살펴볼 것이다. –

+0

질문 자체를 편집하지 않았습니다. 나는 당신의 대답에 대한 코멘트를 편집했다. 불행히도 이러한 주석은 올바르게 형식화 될 수 없으며, 주석을 게시하고 [편집] 5 분 밖에 남지 않습니다. 그래서 ... 정말 조직되지 않았습니다 :) – Alex

답변

1

불확정 순서로 여러 개의 원치 않는 인수를 제거하려면 재귀 형식을 사용해야합니다. 질문에 외부 리디렉션 루프를 사용하지만 원치 않는 엣지 경우가있는 예제가 포함되어 있습니다.

후행 ?&을 남기는 엣지 경우는 복수 if...return 블록을 사용하여 클리어 할 수 있습니다. 예를 들어

:

if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$) { 
    return 301 $uri; 
} 
if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$) { 
    return 301 $uri?$1; 
} 
if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$) { 
    return 301 $uri?$1$2; 
} 

별도로 특수하게 조작 된 return 문을 발생 ? 후행 또는 & 후행 때 두 경우를 치료하여 위의 작품.

위의 코드는 외부 리디렉션 루프를 사용하여 작동합니다.


nginx

또한 내부 리디렉션을 수행 할 수 있으며, 하나의 방법은 이것이 location 블록 내에서 rewrite...last하여 사용하는 것이다.

이 경우 제한은 원치 않는 인수의 영향을받는 URI 집합을 처리 할 위치 블록을 찾는 것입니다. 아래 예제에서는 location / 블록을 사용하지만, 요구 사항은 구성 내의 다른 location 블록과 영향을받는 URI 세트의 영향을받습니다.

내적 변수 $args에 대한 할당이 성공 했음에도 불구하고 내 대답은 해당 기술을 피했습니다.

다음 예제는 rewrite...last을 사용하여 이전 예제를 다시 구현하고 return 301 실제 블록을 수행하는 if 블록을 추가합니다. this document에 표시된 예제 만 if 블록 내에서 문을 허용 사용

location/{ 
    if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*$) { 
     rewrite^$uri? last; 
    } 
    if ($args ~ ^(?:unwanted1|unwanted2)=[^&]*(?:&(.*))?$) { 
     rewrite^$uri?$1? last; 
    } 
    if ($args ~ ^(.*)&(?:unwanted1|unwanted2)=[^&]*(&.*)?$) { 
     rewrite^$uri?$1$2? last; 
    } 
    if ($request_uri ~ \?(.*&)?(unwanted1|unwanted2)=) { 
     return 301 $uri$is_args$args; 
    } 

    try_files $uri $uri/ =404; 
} 

참고.

+0

매우 상세한 답변을 해주셔서 감사합니다. 내일 철저한 검사를하고 어떻게 작동하는지 알려 드리겠습니다. – Alex

+0

Richard - 서버 성능 관점에서 보면 SEO 및 "청결"관점에서 두 번째 기법이 선호되는 반면 (외부 리디렉션 체인) 첫 번째 기법이 선호된다고 가정합니다. 이것을 가정 할 때 나는 맞습니까? – Alex

관련 문제