Điểm:1

Chuyển đổi NGINX var từ chữ hoa sang chữ thường

lá cờ co

Tôi cần một chút trợ giúp với thiết lập nginx conf. Cấu hình của tôi về cơ bản là thế này ...

bản đồ $http_apikey $api_client_name {
    mặc định "";

    "CLIENT_ID" "client_one";
}

người phục vụ {
  truy cập_log /dev/stdout chính;

  nghe 443 ssl;
  máy chủ_tên máy chủ cục bộ;

  # Cấu hình TLS
  ssl_certificate /etc/nginx/ssl/cert.pem;
  ssl_certificate_key /etc/nginx/ssl/key.pem;
  ssl_session_cache được chia sẻ:SSL:10m;
  ssl_session_timeout 5 phút;
  ssl_ciphers CAO:!aNULL:!MD5;
  ssl_protocols TLSv1.2 TLSv1.3;

  bật proxy_intercept_errors; # Không gửi lỗi phụ trợ cho khách hàng
  ứng dụng default_type/json; # Nếu không có kiểu nội dung thì giả sử JSON

  vị trí ~ ^/index-$http_apikey {
      nếu ($http_apikey = "") {
          trả lại 401; # Không được phép
      }

      nếu ($api_client_name = "") {
          trả lại 403; # Cấm
      }

      proxy_pass http://elasticsearch:9200;
  }

....

Ý tưởng là để có được http_apikey từ thông tin tiêu đề trên POST và sử dụng nó như một phần của liên kết. Tuy nhiên, VAR, http_apikey, có chữ in hoa cũng như chữ thường và số. Mặc dù vậy, URI dự kiến ​​​​sẽ ở dạng chữ thường, vì vậy về cơ bản:

  vị trí ~ ^/index-$http_apikey.lower() {
      nếu ($http_apikey = "") {
          trả lại 401; # Không được phép
      }

      nếu ($api_client_name = "") {
          trả lại 403; # Cấm
      }

      proxy_pass http://elasticsearch:9200;
  }

vị trí ~ ^/index-$http_apikey.lower()

Có cách nào để làm điều này trong nginx không? Giống như trong bash tôi sẽ chỉ ${http_apikey,,} ... có tương đương với nginx không?

Cảm ơn

Gerard H. Pille avatar
lá cờ in
"VAR" là gì?
Điểm:1
lá cờ za

Phiên bản ngắn: không, điều đó là không thể.

Phiên bản ngắn gọn nhưng lạc quan: điều đó là không thể khi chỉ sử dụng nginx, nhưng có thể khi sử dụng tiện ích mở rộng lua. Hoặc bất kỳ tiện ích mở rộng nginx ngôn ngữ lập trình nào khác, như perl.

Phiên bản dài: vì vậy bạn đang cố viết mã bên trong tệp cấu hình nginx. Mặc dù cấu hình nginx cung cấp một số công cụ lập trình (đặt biến, sử dụng các nhánh có điều kiện), ngôn ngữ cấu hình của nó không phải là mã (sự khác biệt chính giữa ngôn ngữ lập trình và cấu hình là các câu lệnh mã được xử lý theo thứ tự xuất hiện và hiệu ứng câu lệnh cấu hình độc lập với vị trí của nó - đó là lý do tại sao có rất nhiều tiếng ồn xung quanh các nhánh có điều kiện của nginx (Nếu là ác, và tương tự.) Và đó có lẽ là điều mà Igor Sysoev và nhóm của nó đã nhận ra từ lâu và bắt đầu triển khai tiện ích mở rộng lập trình chính thức của nginx - lua, thay vì khắc phục sự cố trong phôi lập trình cấu hình nginx (điều đó đó là lý do tại sao nó là một phần và không đầy đủ - nếu không đưa ra khác, thứ tự của if và bộs là ẩn, v.v. Vì vậy, ngay khi bạn muốn đặt mã bên trong các tệp cấu hình nginx, bạn nên bắt đầu sử dụng lua (hoặc một cái gì đó khác). Lua có thể được thêm vào bằng cách sử dụng cởi mở phiên bản nginx, chứa lua được xây dựng phù hợp với nhiều tiện ích mở rộng và ví dụ hoặc chỉ thêm riêng mô-đun nginx thd lua, điều này tùy thuộc vào bản phân phối bạn đang sử dụng.

Nick Hatfield avatar
lá cờ co
Cảm ơn cho cái nhìn sâu sắc. Tôi đang sử dụng bộ chứa docker nginx mới nhất có phiên bản 1.14.2. Bạn có thể đưa ra một ví dụ về cách giải quyết vấn đề trên bằng perl hoặc lua không? Cảm ơn
drookie avatar
lá cờ za
ví dụ perl nằm dưới liên kết đầu tiên tôi đã cung cấp.
Nick Hatfield avatar
lá cờ co
Thật sự cảm ơn!!
Nick Hatfield avatar
lá cờ co
Này, tôi lại... vì vậy ví dụ perl dường như chỉ hiển thị và phù hợp với trường hợp sử dụng khi khách hàng đang gửi một URI như `SoMeThInG` và lệnh perl sẽ chuyển đổi `nginx.var.uri` thành chữ thường chuỗi. Tôi gặp khó khăn khi làm cho điều này hoạt động với kịch bản mà tôi mô tả ở trên, nơi người dùng đang gửi tiêu đề HTTP `-H "apikey: SoM3RaNd0m"`, và chúng tôi cần nắm bắt điều này và đặt nó thành chữ thường rồi gửi đi đến vị trí và để nó khớp với chữ thường ở đó. `http_apikey: S0m3RaD0m3` `(perl => http_apikey_lowercase)` `vị trí ~ ^/hnt-$http_apikey_lowercase { }`

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.