2016-12-02 15 views
5

Tôi đang sử dụng AWS CloudFront để chấm dứt SSL trước khi nhấn vào chương trình phụ trợ của mình và cần phân biệt lưu lượng truy cập này với lưu lượng truy cập không phải CloudFront để đặt proxy_set_header trong Nginx.Nginx đặt proxy_set_header nếu tiêu đề có mặt

Tôi tin rằng cách tốt nhất để làm điều này là kiểm tra tiêu đề X-Amz-Cf-Id (added by CloudFront) và đặt proxy_set_header khi có mặt. Tuy nhiên, tôi biết rằng không thể đặt proxy_set_header trong câu lệnh Nginx if, dẫn đến câu hỏi của tôi.

Làm cách nào để đặt giá trị proxy_set_header khi có tiêu đề đó?

+0

Có thể bạn không thiết lập tiêu đề mà trong amazon đám mây trước khi nó chấm dứt SSL? – Seb

+0

Cảm ơn @seb, tôi đã thử đặt tiêu đề tùy chỉnh làm tiêu đề name = 'proxy_set_header' và value =' X-Forwarded-Proto https' nhưng nó không hoạt động như mong đợi. Tôi cần phải thêm điều này vào một dòng cụ thể của cấu hình Nginx của tôi vì vậy đừng nghĩ rằng cách tiếp cận đó sẽ hoạt động. Mục tiêu cuối cùng của tôi là nói với ứng dụng của tôi rằng các kết nối CF qua HTTPS. – Manonthemoon

+0

Tôi không sử dụng điện toán đám mây, nhưng tìm kiếm nhanh đã cho tôi kết quả này: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html Vì vậy, mặt trước đám mây có thể đặt tiêu đề. Nếu đám mây phía trước có thể thiết lập các tiêu đề, hơn nó sẽ làm cho ý nghĩa hơn nhiều để thiết lập các tiêu đề có trong nginx. Hoặc bạn có thể tìm kiếm và tìm giải pháp này: http://serverfault.com/questions/506972/nginx-why-i-cant-put-proxy-set-header-inside-an-if-clause – Seb

Trả lời

2

Câu trả lời chung là bạn có thể đặt biến trong if và sau đó sử dụng biến. Như thế này:

set $variable ""; 
if ($http_X_Amz_Cf_Id) { 
    set $variable "somevalue"; 
} 
proxy_set_header someheader $variable; 
4

if báo cáo không phải là một cách tốt để thiết lập tiêu đề tùy chỉnh bởi vì họ có thể cause statements outside the if block to be ignored.

Bạn có thể sử dụng số map directive thay vì không dễ bị các vấn đề tương tự.

# outside server blocks 
map $http_X_Amz_Cf_Id is_cloudfront { 
    default "No"; 
    ~. "Yes"; # Regular expression to match any value 
} 

Sau đó:

# inside location block 
proxy_set_header X_Custom_Header $is_cloudfront; 
+0

Câu trả lời có thể chấp nhận được để đề xuất bản đồ. Chưa thử nghiệm ~. "Có" mặc dù. – Shrey

+0

Có vẻ như thiếu '$', ít nhất là trong phiên bản nginx hiện tại: 'map $ http_X_Amz_Cf_Id $ is_cloudfront' – Julien

Các vấn đề liên quan