Kiểm tra nếu biến nginx được đặt


14

Tôi cần đặt một biến thành một giá trị mặc định nếu nó chưa được đặt. Sau đây cấu hình thực hiện công việc:

if ($foo ~ "^$") {
   set $foo default-value;
}

Nhưng nó tạo ra các cảnh báo thời gian chạy:

sử dụng biến "foo" chưa được khởi tạo

Có cách nào để kiểm tra nếu một biến được đặt mà không tạo cảnh báo và không tắt cảnh báo trên toàn cầu với:

uninitialized_variable_warn off;


2
Chỉ tìm thấy điều này trong khi tìm kiếm một cái gì đó tương tự, nhưng có vẻ như uninitialized_variable_warnkhông cần phải được đặt trên toàn cầu, bạn chỉ có thể đặt nó ở nơi bạn cần sử dụng các biến có khả năng chưa được xác định. Tôi đang sử dụng điều này để chuyển các chi tiết SSL cho PHP, sẽ trống nếu trang được truy cập mà không có SSL.
Harastak

@Harastak có vẻ như không phải vậynginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te

Bạn vẫn còn đặt nó ở một nơi khác? Tôi đang sử dụng uninitialized_variable_warnnhư một phần của php.confchỉ được nhập bởi các vị trí hỗ trợ PHP, vì vậy tôi chắc chắn chỉ sử dụng nó trong các phạm vi đó, trong khi để lại cảnh báo ở mọi nơi khác. Tôi không uninitialized_variable_warnđặt ở bất kỳ phạm vi nào khác mặc dù (để mặc định là true).
Harastak

Câu trả lời:


11

Tôi đang sử dụng cách sau để kiểm tra xem có tồn tại một biến không:

if ($dir = false) {
    set $dir "";
}

Nếu nó không được đặt trước khi nó đạt đến khối vị trí này, thì nó sẽ đặt nó thành một chuỗi trống. Bạn có thể dễ dàng thêm một chuỗi giữa các dấu ngoặc kép. Tôi không nhận được bất kỳ lỗi nào khi thực hiện kiểm tra cấu hình bằng cách này.

Xin vui lòng cho tôi biết nếu bạn nhìn thấy khác.


Tôi đang thấy nginx: [nổi lên] biến "dir" không xác định
Alex Barker

Kiểm tra sai này không hoạt động nữa, vui lòng sử dụng$foo ~ "^$"
Valdrinium

1

Hành vi dường như đã thay đổi hoặc ít nhất là khác nhau đối với các giá trị tham số truy vấn sử dụng $arg_<name>. Trên nginx 1.13.6, sử dụng thông tin sau để kiểm tra xem giá trị truy vấn trong biến ngx có tồn tại không:

if ($arg_test = false) {
    default_type 'text/plain';
    return 404;
}

không chuyển sang 404. Sử dụng:

if ($arg_test = '') {
    default_type 'text/plain';
    return 404;
}

trả về 404, nếu tham số truy vấn không tồn tại. Hữu ích cho việc không truy cập ngược dòng nếu không tồn tại tham số truy vấn bắt buộc.



0

Một tùy chọn dễ dàng, nếu bạn tùy ý đặt biến trong tệp được bao gồm, chỉ đơn giản là đặt giá trị mặc định trước.

set $value 'default';
include maybe-set-value.conf;

Câu lệnh set thứ hai trong tệp conf sẽ thay thế giá trị mặc định.

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.