Ngexx location regex không hoạt động với proxy qua


43

Tôi đang cố gắng để 2 chỉ thị vị trí này hoạt động trong Nginx nhưng tôi gặp lại một số lỗi khi khởi động Nginx.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Đây là lỗi tôi nhận được:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

Nghe có vẻ quen thuộc với bất cứ ai? Tôi đang thiếu gì ở đây?

Câu trả lời:


48

Một bổ sung nhỏ cho câu trả lời tuyệt vời từ Xaviar :

Nếu bạn không quen với nginx, có một sự khác biệt quan trọng giữa việc thêm dấu gạch chéo vào cuối lệnh proxy_pass.

Những điều sau đây không hoạt động:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

nhưng cái này thì có:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

Sự khác biệt là /ở cuối proxy_passchỉ thị.


1
Điều đó đã /khắc phục vấn đề cấu hình của tôi, thật khó để bắt, cảm ơn!
yorch

Đã lái tôi hạt dẻ, cảm ơn đã chỉ ra rằng!
cyrrill

21

Nó cho bạn biết rằng URI trong chỉ thị pass proxy không thể được sử dụng ở vị trí regex. Điều này là do nginx không thể thay thế một phần của URI khớp với biểu thức chính quy trong locationkhối bằng phần được truyền theo proxy_passchỉ thị một cách chung chung.

Đơn giản chỉ cần tưởng tượng regex vị trí của bạn là /foo/(.*)/bar, và bạn chỉ định proxy_pass http://server/test, nginx sẽ phải ánh xạ regex vị trí của bạn sang một regex khác ở cấp độ cao hơn vì bạn không muốn kết thúc /foo/test/bar/somethingnhưng với /test/something. Vì vậy, điều đó là không thể.

Vì vậy, đối với phần này bằng cách sử dụng sau đây nên làm việc:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Tuy nhiên, sẽ không thể viết lại các chuyển hướng để khớp với mẫu URI của khối vị trí vì nó viết lại URI hiện tại đang được xử lý, khiến cho không thể thay đổi Locationtiêu đề dựa trên yêu cầu ban đầu trước khi viết lại.


2
di chuyển đường dẫn thành một quy tắc viết lại làm việc cho tôi. cảm ơn.
sonjz
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.