2013-08-26 2 views
5

다음 패턴을 얻으려고합니다. 몇 가지 사전 정의 된 호스트로 전환 할 수 있도록 클라이언트 측 코드에서 동적 경로를 지정해야합니다./fwd/url에 별칭을 추가하여 이러한 호스트를 매핑합니다. 별명은 다음과 같이의 nginx에 실제 서버에 매핑 : 지도와 정규식을 사용하는 동적 proxy_pass

map $uri $repoUrl { 
    default    invalid; 
    ~^/fwd/foo/.*  http://foo.domain.nl/; 
    ~^/fwd/bar/.*  http://bar.domain.nl/; 
    } 

그런 다음 서버 설정 부분에서 나는 FWD 및 적용 매핑 된 별칭 값로 시작하는 URL을 잡을 수있어. 별칭이 URL에 추가되어야하는 후에 URL의 나머지 부분. 나는 이것을 테스트하는 경우

location /fwd/(\w+)/(.*)$ { 
    add_header X-FwdHost "$repoUrl$2"; 
    add_header Access-Control-Allow-Origin "*"; 
    proxy_pass   "$repoUrl$2"; 
    proxy_redirect off; 
    access_log on; 
} 

:

curl -i http://localhost:8080/fwd/foo/something/else 

내가 얻을 :

X-FwdHost: http://foo.domain.nl/ 

그러나 정규 표현식에서 테스트 결과는 내가 얻을 때 :

$1: foo 
$2: something/else 

그래서 전체 그것은 작동하는 것 같습니다. 정규식은 괜찮은 것처럼 보이지만 하나의 문자열로 연결할 수는 없습니까? 어떤 아이디어를 얻거나 더 쉽게/더 좋은 방법으로 같은 것을 성취 할 수 있습니까?

[편집]

나는 앞으로라는 이름의 쿼리 매개 변수를 사용하여이 작업을 수행 할 수있는 가능성이 훨씬 쉬운 방법을 발견했다. 먼저에 대한 권리 호스트 쿼리 매개 변수를 매핑 :

map $arg_forward $repo_forward { 
default   http://invalid_repo_forward/; 

foo    http://foo.domain.nl/; 
bar    http://bar.domain.nl/; 

}

는 다음 경로에있는 매개 변수를 사용하여 전달한다 :

location /fwd/ { 
    add_header X-FwdHost $repo_forward; 
    add_header Access-Control-Allow-Origin "*"; 
    proxy_pass   $repo_forward; 
    proxy_redirect off; 
    access_log on; 
} 

내가 기대하고 URL처럼 :

http://localhost:8080/fwd/?forward=foo 

가 발생할에 :

http://foo.domain.nl/ 

...하지만 여전히 작동하지 않습니다. 나는 404를 돌려 받는다. 내가 뭘 놓치고 있니?

답변

6

나는 결국, 다시 첫 번째 방법에 갔다. 클라이언트 로직을 복잡하게 만듭니다.

나는 나의 첫 번째 방법에 대한 해결책을 발견했다. 위치 명령문의 정규식이 잘못되었습니다. 당신은 정규 표현식을 사용하여 변수 이름을 캡처해야합니까? 같은 :

location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$ 

그런 다음 $ fwd_alias는 foo는 나 바 같은 별칭이 포함됩니다. $ fwd_path는 그 이후의 전체 경로를 포함합니다.

당신이로 proxy_pass를 지정하는 선택 쿼리 매개 변수를 포함하여 전체 경로에 전달합니다 : 그것은

proxy_pass http://$repo_url$fwd_path$is_args$args; 

의 그!

location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$ { 
    resolver 8.8.8.8; 
    add_header Access-Control-Allow-Origin "*"; 
    proxy_pass http://$repo_url$fwd_path$is_args$args; 
    proxy_redirect off; 
    access_log on; 
} 

그리고 다음과 같은 경로 요청 :에

http://localhost:8080/fwd/foo/something/else?with=query 

지도 그래서 지금

, 첫 번째 예에서 매핑을 포함하고 해결을 추가, 그것은 아래로 온다 :

http://foo.domain.nl/something/else?with=query 
+0

가능성은 당신이 솔루션의 "전체"사본을하시기 바랍니다 게시 할 수 있습니다. 나는 (내가 할 수있는 한) 이것을 계속하고 있지만 여전히 404를 얻는다. Alstublieft. – Guy

1

나는 바른 길 위에있었습니다. 당신은 당신이 두 가지를 할 필요가 변수 인수 proxy_pass 사용하려면

:

  1. 는 호스트 이름을 해결하기 위해 해결 문을 추가합니다. 내가 이해할 때, 시작할 때 nginx는 config에서 모든 도메인 이름을 찾아 IP에 매핑합니다. 우리가 가변 호스트 이름을 사용하고 있기 때문에 nginx는 config를 로딩 할 때 그것을 찾을 수 없으며 DNS 해석자를 지정할 필요가 있습니다.

  2. 당신이 HTTP를 추가해야 proxy_pass에서 변수 사용 : // 그것입니다. 왜 그런지 모르겠습니다.

그래서이 결과 :

location /fwd/ { 
    resolver 8.8.8.8; 
    add_header X-FwdHost $repo_forward; 
    add_header Access-Control-Allow-Origin "*"; 
    proxy_pass http://$repo_forward; 
    proxy_redirect off; 
    access_log on; 
} 

그리고 그것은 작동한다!그것은이에 대한 URL에 쿼리 매개 변수를 추가하는 것이 편리 아니기 때문에 :)