Nginx : 여러 경로에 대한 위치 정규식


30

nginx 설정에는 두 가지 위치가 있습니다.

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

이 두 가지를 한 곳으로 결합하려면 어떻게해야합니까?

내가 이미 한 일 :

나는 이 제안을 시도했다

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

그러나 그것은 나를 위해 작동하지 않습니다.

또한 백엔드를 사용하지 않으면 다음 구성이 올바르게 작동합니다.

location ~ ^/(static|media)/ {
  root /home/project_root;
}

업데이트 (로그의 일부 문자열)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

해결책

실제로 내 솔루션은 정상적으로 작동합니다.

location ~ ^/(static|media)/ {
  root /home/project_root;
}

이 문제는 백엔드와 아무 관련이 없습니다. Guido Vaccarella가 올바르게 location ~ ...일치하는 것을 발견했을 때 일치하는 다른 것을 따라갔습니다 location ~ ....


정규식 프록시 패스가 작동하지 않는 이유를 모르겠습니다. 시도하면 어떻게 되나요?
— Grumpy

시도하면 프론트 엔드 nginx에서 404 오류가 발생합니다.
— Vlad T.

위치 설명의 끝에있는)가 질문에 오류이거나 구성 파일에도 있습니까?
— Guido Vaccarella

나머지 구성에 오류가 있는지 다시 확인해야합니다. 또한 404를 던지는 이유와 위치, 누락 된 부분을 확인하여 조사 할 수 있습니다. 발견되지 않은 오류 문서에서 404가 발생하여 이전에 발생한 오류를 살펴볼 수도 있습니다.
— Grumpy

오류 로그에서 오류 제공하십시오
— 모하마드 AbuShady

답변:


30

nginx 설명서 에 따르면 :

그런 다음 구성 파일에 나타나는 순서대로 정규식이 검사됩니다. 정규식 검색은 첫 번째 일치시 종료되며 해당 구성이 사용됩니다.

구성에서 다음 위치는 proxy_pass가있는 위치보다 먼저 정의되며 static 아래의 js 및 css 파일 요청과 일치합니다 .

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

불행히도 "log_not_found off"절은이 위치와 관련된 파일을 찾을 수 없음 오류에 대한 로깅을 비활성화하므로, error_log가 비어 있습니다!

이 위치를 주석 처리하거나 proxy_pass를 사용하여 위치 다음으로 이동할 수 있습니다 ( 정적 / 미디어에 없는 다른 파일에 필요한 경우 ).


13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

해야한다...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

닫는 괄호 ()가 아닌 중괄호 {} 여야합니다.

그것을 보는 데 걸린 시간을 믿을 수 없습니다. 귀도는 의견에서 옳았습니다.


오해해서 유감스럽게 생각합니다 |media). 문자열에서 "미디어"뒤의 "괄호" 가 "위치"로 시작 되었다고 생각했습니다 . 그러나 여기서 잘못된 버팀대는 오타 일뿐입니다 (문제가 수정되었습니다). 그렇지 않으면이 nginx 구성이로드되지 않고 unexpected ")"...다시 미안 과 같은 오류가 발생 합니다.
— 블라드 T.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.