Nginx - 쿼리 문자열 매개변수를 기반으로 한 리디렉션

Nginx - 쿼리 문자열 매개변수를 기반으로 한 리디렉션

nginx 구성에는 해결해야 할 약간 복잡한 문제가 있습니다. 현재 문서 루트에 소프트웨어가 설치되어 있습니다. 이 소프트웨어는 콘텐츠를 표시하기 위해 단일 진입점(index.php)과 쿼리 문자열을 사용합니다. 예시 URL은 다음과 같습니다.

/index.php?forums/forum-name.1
/index.php?threads/thread-name.1
/index.php?users/user-name.1

등...

이제 이 소프트웨어를 문서 루트의 하위 디렉터리로 이동 /f/하고 새 소프트웨어를 문서 루트에 설치합니다. 이 소프트웨어는 또한 index.php를 사용합니다(그러나 쿼리 문자열은 없음). 따라서 이전 소프트웨어의 URL만 다시 작성하기 위한 일련의 다시 쓰기 규칙을 마련해야 합니다. 동시에 URL에서 index.php도 제거할 예정입니다. 예제 매핑 세트는 다음과 같습니다.

/index.php?forums/forum-name.1 --> /f/forums/forum-name.1
/index.php?threads/thread-name.1 --> /f/threads/thread-name.1
/index.php?users/user-name.1 --> /f/users/user-name.1

따라서 기본적으로 index.php 요청의 특정 하위 집합(?forums, ?threads, ?users 등만 포함)을 리디렉션한 다음 index.php 부분을 제거하고 /f/ 디렉터리로 보내야 합니다.

나는 아침 내내 이것을 가지고 놀았지만 내가 원하는 방식으로 작동하도록 할 수 없습니다.

답변1

특히 쿼리 문자열이 포함된 경우 복잡한 리디렉션을 관리하려면 지시어를 map사용할 수 있습니다.

및 표현식의 쿼리 문자열(이후 항목 ?) 은 정규화된 URI의 일부가 아니기 때문에 일치시킬 수 없습니다. 그러나 에는 쿼리 문자열이 포함된 원본 요청이 포함되어 있습니다.locationrewrite$request_uri

매개변수가 일관된 순서로 전송되지 않으면 일치하는 것이 $request_uri문제가 될 수 있으며, 이상한 문자가 포함된 URI도 퍼센트 인코딩됩니다.

지시문은 map문자열 및/또는 정규식과 일치할 수 있습니다. 보다이 문서자세한 내용은.

예를 들어:

map $request_uri $redirect {
    default                                               0;
    ~*^/index\.php\?(?<suffix>(forums|threads|users).*)$  /f/$suffix;
    ...
}

server {
    ...
    if ($redirect) {
        return 301 $redirect;
    }
    ...
}

항상 사용명명된 캡처map블록 정규식 에서 . 매핑된 표현식은 명령문에서 평가됩니다 return. 내가 이해하는 바에 따르면, nginx다음과 같은 내용이 포함된 진술을 접할 때마다정규식(예 rewrite: 일부 location블록 및 일부 if명령문) 숫자 캡처가 재설정됩니다. 사용명명된 캡처명세서의 범위 내에 남아 있는지 확인합니다 return.

보다이 주의의 사용에 대하여 if.

관련 정보