인기가 높아지고있는 새로운 정규식 기반 답변을 해결하고 싶습니다.
location ~ ^/en(/?)(.*)$ { # OOPS!
proxy_pass http://luscious/$2$is_args$args; # OOPS!
}
솔루션이 언뜻보기에는 더 귀엽게 보일 수 있지만 여러 가지 이유로 잘못되었습니다.
위의 정규 표현식은의 요청과 일치 /enjoy
하여 /joy
업스트림으로 리디렉션합니다 . 이것이 실제로 의도 된 것입니까?
에 대한 요청은 /en
리디렉션을 일으키지 않고 /
업스트림에서 직접 서비스를 제공합니다 (거의 요청 /en/
이 이루어진 것처럼 보이지는 않지만). 루트 페이지 업스트림에서 상대 URI를 사용하는 경우 (그렇지 않으면 /en/
업스트림 URI 내에 접두사 가없는 이유는 무엇입니까?) (예 : src="style.css"
언어 별 참조 url("menu.png")
) 브라우저에서 요청합니다. 로 /style.css
대신 /en/style.css
. (또는 어디에서나 절대 URI를 사용하더라도 누군가가 모호한 반 선택적 리소스를 상대적으로 참조하면 어떻게 되나요?) 죄송합니다.
내 당으로 이미 OP 자신의 대답으로 언급 한 또 다른 질문에서 이전 조언 정규 표현식을 사용하여 방지 proxy_redirect
의 기본 값을 갖는로부터 지시를 default
그것을 거절, off
대신. 즉 Location: http://127.0.0.1:8080/en/dir/
, 요청 이 있을 때 업스트림이 응답 /en/dir
하면 클라이언트가 보게 될 것입니다. 이는 제대로 작동하지 않습니다. ( /en
처음에 정규 표현식을 사용하도록 요청 하는 요청에 대해 특히 아이러니했을 것입니다. 그러나이 특정 구현은 위에서 이미 언급 한 것처럼 다른 문제가 발생합니다.) 또한 이미upstream
지시어를 선택하면 사용자 지정 서버를 사용하려고 시도 할 때, 특히 둘 이상의 업스트림 서버가있는 경우 더욱 추악해질 수 있습니다. proxy_redirect
각 서버 마다 별도의 서버가 있습니까? 에서 정규 표현식을 사용 proxy_redirect
하여 호스트와 일치시킬 수도 있지만 앞으로 도메인 간 리디렉션을 제공하기로 결정한 경우 어떻게해야합니까?
단일 정규 표현식 기반 위치로 위의 포인트 중 일부를 해결하려고 시도하면 다음을 수행 할 수 있습니다 ( 더 간단 하게하기 위해 기반 지시문 proxy_pass
에서 서버에 대한 참조를 삭제해야 함 ).upstream
proxy_redirect
location ~ ^/en/?((?<=/).*)?$ {
location = /en { return 302 /en/; }
proxy_pass http://127.0.0.1:8080/$1$is_args$args;
proxy_redirect http://127.0.0.1:8080/ /en/;
}
따라서, 나에게 묻는다면, 두 형제 최상위 위치를 가진 독창적 인 솔루션은 대신 정규식 경로를 통해 토끼 구멍에 파는 것보다 더 나은 아이디어입니다.