Nginx: regex vị trí cho nhiều đường dẫn


30

Tôi có hai vị trí trong nginx config hoạt động:

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

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

Làm thế nào tôi có thể kết hợp cả hai vào một vị trí?

Những gì tôi đã làm:

Tôi đã thử đề nghị này

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

nhưng nó không làm việc cho tôi.

Ngoài ra, khi tôi không sử dụng phụ trợ, cấu hình sau hoạt động đúng:

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

cập nhật (một số chuỗi từ nhật ký)

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$

DUNG DỊCH

Trên thực tế, giải pháp của tôi không hoạt động tốt:

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

và vấn đề không liên quan gì đến phụ trợ. Vì Guido Vaccarella nhận thấy một cách chính xác, nó chỉ theo sau một trận đấu khác location ~ ..., do đó tôi location ~ ...không có cơ hội chạy.


Tôi không thấy lý do tại sao regex proxy của bạn không hoạt động. Điều gì xảy ra khi bạn thử nó?
Grumpy

Khi tôi thử nó, nginx frontend ném lỗi 404.
Vlad T.

Là) ở cuối câu lệnh vị trí chỉ là một lỗi trong câu hỏi của bạn hay nó cũng nằm trong tệp cấu hình của bạn?
Guido Vaccarella

Bạn nên kiểm tra lại phần còn lại của cấu hình của bạn để tìm lỗi. Ngoài ra, có thể muốn điều tra lý do tại sao nó ném 404 bằng cách xem nơi nó đang tìm, thứ còn thiếu. Cũng có thể nó ném 404 vào tài liệu lỗi không được tìm thấy và do đó cần xem xét một lỗi đã ném trước đó.
Grumpy

vui lòng cung cấp lỗi từ nhật ký lỗi
Mohammad AbuShady

Câu trả lời:


30

Theo tài liệu nginx :

Sau đó, các biểu thức chính quy được kiểm tra, theo thứ tự xuất hiện của chúng trong tệp cấu hình. Việc tìm kiếm các biểu thức chính quy chấm dứt trên kết quả khớp đầu tiên và cấu hình tương ứng được sử dụng.

Trong cấu hình của bạn, vị trí sau được xác định trước vị trí có proxy_pass và vị trí này khớp với yêu cầu của tệp js và css dưới dạng tĩnh :

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

Thật không may, mệnh đề "log_not_found off" sẽ vô hiệu hóa việc ghi nhật ký cho bất kỳ lỗi không tìm thấy tệp nào liên quan đến vị trí này, đó là lý do tại sao error_log của bạn trống!

Bạn có thể cố gắng nhận xét vị trí này hoặc di chuyển vị trí đó sau vị trí có proxy_pass (nếu bạn cần nó cho các tệp khác không ở dạng tĩnh / phương tiện ).


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

Nên là...

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

Việc đóng cần phải là một dấu ngoặc {}, không phải là dấu ngoặc đơn ().

Không thể tin được bao lâu để thấy điều đó. Guido đã đúng từ các ý kiến.


Ồ, xin lỗi vì sự hiểu lầm, tôi nghĩ nó có nghĩa là dấu ngoặc sau khi "phương tiện" |media)trong chuỗi bắt đầu bằng "vị trí". Nhưng cú đúp sai ở đây chỉ là một lỗi đánh máy (sửa trong câu hỏi). Nếu không, cấu hình nginx này sẽ không được tải và sẽ gây ra lỗi như unexpected ")"...Xin lỗi, một lần nữa.
Vlad T.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.