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

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

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 ~ ...실행할 기회가 없었습니다.

답변1

에 따르면nginx 문서:

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

구성에서 다음 위치는 Proxy_pass가 있는 위치 앞에 정의되어 있으며 아래의 js 및 css 파일 요청과 일치합니다.공전:

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

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

이 위치를 주석 처리하거나 Proxy_pass를 사용하여 해당 위치 뒤로 이동할 수 있습니다(이 위치가 아닌 다른 파일에 필요한 경우).공전/미디어).

답변2

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

해야한다...

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

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

그것을 보는 데 얼마나 오랜 시간이 걸렸는지 믿을 수 없습니다. Guido가 댓글에서 옳았습니다.

관련 정보