Nginx wildcard / regex trong đường dẫn vị trí


22

Cấu hình Nginx tôi đã ném 404 cho .php like:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Tuy nhiên tôi có một số tệp index.php trong thư mục con mà tôi muốn chạy. Cấu hình hiện tại giống như:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

nó hoạt động hoàn hảo, nhưng vấn đề là các vị trí trùng lặp và nếu có nhiều trang con thì cấu hình sẽ trở nên rất lớn.

Tôi đã thử ký tự đại diện như * và một số regex, cho biết thử nghiệm nginx đã vượt qua nhưng không tải trang tức là 404. Những gì tôi đã thử là:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Có cách nào tôi có thể có một số tên đường dẫn trong vị trí là regex hoặc ký tự đại diện không?

Câu trả lời:


32

Công cụ =sửa đổi trong locationkhối là một kết hợp chính xác, không có bất kỳ ký tự đại diện, kết hợp tiền tố hoặc biểu thức chính quy nào. Đó là lý do tại sao nó không hoạt động.

Trên nỗ lực regex của bạn, [a-z]khớp một ký tự duy nhất giữa az. Đó là lý do tại sao nó không làm việc cho bạn.

Bạn cần phải thiết lập vị trí của bạn như sau. Lưu ý thứ tự của locationbáo cáo. nginx chọn điều kiện regex phù hợp đầu tiên.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Tôi sử dụng khớp trường hợp nhạy cảm ở đây ( ~sửa đổi thay vì ~*). Trong trường hợp đầu tiên, tôi khớp với phần đầu tiên của đường dẫn, sau đó một hoặc nhiều số ký tự chữ cái / số và sau đó index.php. Bạn có thể sửa đổi phạm vi khớp, nhưng nhớ các +lần lặp lại cho "một hoặc nhiều".

Cái thứ hai khớp với bất kỳ URI nào kết thúc bằng .php. Bạn không cần thêm các ký tự trong phiên bản của mình do cách thức hoạt động của các biểu thức thông thường.


cảm ơn, vâng, sự lặp lại điều chính đã bị thiếu trong regex. +Đã sửa nó.

1

Thứ tự là quan trọng, từ mô tả "vị trí" của nginx :

Để tìm vị trí khớp với một yêu cầu đã cho, trước tiên nginx kiểm tra các vị trí được xác định bằng chuỗi tiền tố (vị trí tiền tố). Trong số đó, vị trí có tiền tố phù hợp dài nhất được chọn và ghi nhớ. 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. Nếu không tìm thấy kết quả khớp với biểu thức chính quy thì cấu hình của vị trí tiền tố được nhớ trước đó sẽ được sử dụng.

Nó có nghĩa là:

  • Đầu tiên =. (Kết hợp "tiền tố phù hợp dài nhất")
  • Rồi những người ngầm. (Kết hợp "tiền tố phù hợp dài nhất")
  • Rồi regex. (trận đấu thứ nhất)

Bạn cần điều chỉnh thứ tự các phần regex.

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.