2014-03-05 4 views
0

nginx url에서 매개 변수를 전달하는 방법. http://127.0.0.1:1000/samp/test1/result?num1=10&num2=30을 클릭하면 http://127.0.0.1:80/samp/test1/result?num1=10&num2=30으로 리디렉션됩니다. 이것이 가능한가? 아래는 내 nginx 설정 파일입니다.nginx url에 매개 변수 전달

upstream apache { 
server 127.0.0.1:1000; 
} 
server { 
listen  80; 
server_name 127.0.0.1; 
location/{ 
    #root html; 
    #index index.html index.htm; 
    #return 503; 
    proxy_pass   http://apache; 
} 
} 
+0

나는 당신이 묻는 것을 조금 혼란스럽게 생각합니다. 당신은 업스트림'아파치'포트 1000에 도달하도록 구성되어 있고 당신은 포트 80에서 듣고 nginx 있습니다. 만약 당신이 포트를 직접 nginx를 무시합니다 - 의미, nginx 그 요청을 다시 작성할 수 없습니다. –

+0

@ Dan Farrell 포트 1000을 친다면, 모든 요청이 80에 의해 제공되기를 바란다. 그래서 nginx 포트로 리다이렉트해야한다. – user3180402

답변

0

당신이 원하는 것은 가능하다고 생각하지만, 설정 변경은 아파치 끝에서해야합니다. '아파치'는 요청이 직접 포트 1000에 들어오는 처리하는 경우

,이 같은 URI가 표시됩니다

http://127.0.0.1:1000/samp/test1/result?num1=10&num2=30 

을 그러나, nginx를 통해 전송되는 경우, 그것은 다음과 같이 더 볼 것이다 :

http://apache/samp/test1/result?num1=10&num2=30 

그래서 들어오는 URL을 1000으로 확인한 다음 아파치 측에서 요청을 다시 작성하여 포트 80으로 이동합니다 (기본 값이므로 :80은 필요하지 않습니다. 포트가 완전히 지정되지 않았습니다.

백엔드가 실제로 아파치 인 경우 다시 쓰기 규칙을 사용하여 다시 쓰기를 처리 할 수 ​​있습니다.

그러나 포트 80에 아직 연결되어 있지 않으면 nginx에 연결하지 않은 것입니다. 그래서 nginx는 이것을 다시 작성할 수 없습니다.

희망적 이군! 여기

내가 시험 방법은 다음과 같습니다

require 'sinatra' 

set :bind, "0.0.0.0" 
set :port, 1025 

get "/*" do 
"<p>Hello from \"apache\"! You've just requested: 
<code>#{request.url}</code></p> 
" 
end 

다음의 nginx가 thusly 히 구성 :

아파치 측 나는 그것을보고 요청의 전체 URI를 인쇄하는 빠른시나 (루비) 응용 프로그램을 사용

upstream apache { 
    server 192.168.70.1:1025; 
} 

server { 
    server_name localhost; 
    location/{ 
     proxy_pass http://apache; 
    } 

} 

참고 포트 1000은 권한있는 포트이므로 포트 1025를 사용했습니다. 난 당신이 설명하고있는 리디렉션을하고 싶었다면 내가 IPV4 주소와 포트의 정규 표현식과 일치 같은 리디렉션 수

$ curl 'http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! You've just requested: 
<code>http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30</code></p> 
$curl 'http://127.0.0.1:80/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! You've just requested: 
<code>http://apache/samp/test1/result?num1=10&num2=30</code></p> 

:

나는 시험에 요청을 생성하는 컬 사용 :
get "/*" do 

    if request.url =~ %r|^http://([0-9]{1,3}\.){3}[0-9]{1,3}:1025/| 
     redirect "http://localhost:80/#{request.fullpath}" 
    else 
"<p>Hello from \"apache\"! Tou've just requested: 
<code>#{request.url}</code></p> 
" 
    end 
end 

는 지금은 리디렉션 (-L)을 따라 curl을 말해 우리는 그것이 "올바른"경로에 저를 통해 리디렉션을 참조하십시오.

$ curl -L 'http://192.168.70.1:1025/samp/test1/result?num1=10&num2=30' 
<p>Hello from "apache"! Tou've just requested: 
<code>http://apache/samp/test1/result?num1=10&num2=30</code></p> 

내가 사용하는 언어가 아니라는 것을 알고 있습니다 만, 시작하는 데 도움이되기를 바랍니다.

+0

현실 세계에서는 대개 외부 프론트 엔드 (nginx in 귀하의 경우) 외부 액세스 IP를 수신하는 스택의 유일한 부분이 될 것입니다.아파치는 localhost (또는 나의 예제에서와 같이 다른 시스템의 내부 IP 일 가능성이있다.) 그러므로 "잘못된"URL을 통해 도달 할 수있는 방법이 없을 것이다. OS 계층 (예 : iptables)에서 로컬 호스트에서도이를 수행 할 수있는 방법이 있습니다.하지만 내가 말한 것처럼 백엔드는 일반적으로 어쨌든 공개적으로 액세스 할 수 없기 때문에 비정상적입니다. –