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.