Nginx: 항상 로케일 접두사를 포함하도록 URL을 리디렉션합니다.

Nginx: 항상 로케일 접두사를 포함하도록 URL을 리디렉션합니다.

나는 nginx와 리디렉션 규칙을 사용하여 매우 간단해 보이는 무언가를 달성하려고 노력하고 있지만 걸림돌에 부딪혔습니다.

많은 질문과 답변을 살펴봤지만 나에게 맞는 솔루션을 찾을 수 없는 것 같습니다.

내가 달성하고 싶은 것은 다음과 같습니다.

누군가가 다음 URL 중 하나를 사용하여 내 웹사이트를 탐색하는 경우:

http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo

그 사람은 다음 주소로 리디렉션됩니다.

http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/

이것은 지금까지 파일에 있는 순서대로 nginx 구성 파일에 있는 것입니다.

location ^/en/(.*) {
    try_files $uri /index.php$is_args$args last;
}

location / {
    if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
        return 301 /en/$uri;
    }
}

그러나 위 구성에서는 무한 리디렉션 루프가 발생하고 서버가 포기하기 전에 주소 표시줄의 URL이 다음과 같이 종료됩니다.

http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/

누군가 제발:

a) 내 구성이 의도한 효과를 얻지 못한 이유를 설명하여 내가 이해할 수 있도록 하고 나중에 동일한 오류를 반복하지 않도록 하십시오.

b) 작동하고 가능한 경우 내 구성을 개선하는 솔루션을 제안합니다.

c) 가능하다면 더 자세히 설명하고 nginx가 요청과 관련된 로케일을 자동으로 결정하고 위에서 설명한 방식으로 요청을 동적으로 변환하여 이를 포함하도록 하는 방법을 예제와 함께 설명하십시오.

감사해요

답변1

내 구성이 의도한 효과를 얻지 못한 이유를 설명하여 이해하고 향후 동일한 오류를 반복하지 않도록 하십시오.

location ^/en/(.*)유효한 지시어가 아닙니다.

와 혼동하셨을 수도 있습니다 location ^~ /en/(.*). 이는 /en/다음 으로 시작하는 모든 쿼리와 일치합니다 .

실제로 요청은 항상 location /지시문과 일치하므로 무한 루프에 빠지게 됩니다.

작동하는 솔루션을 제안하고 가능하다면 내 구성을 개선하세요.

지시문 내에서 Path 접두사를 사용하세요 location.

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

관련 정보