Vấn đề có thể liên quan đến việc thiếu nhận thức về giao thức khi nói đến bộ nhớ đệm. Một điều khá điển hình là một yêu cầu HTTP lẽ ra phải được chuyển hướng đến một yêu cầu HTTPS sẽ kết thúc trong bộ đệm, giúp chuyển hướng vô điều kiện người dùng đến phiên bản HTTPS, ngay cả khi họ thực sự yêu cầu một phiên bản HTTPS.
Có nhiều cách khác nhau để khắc phục điều này tùy thuộc vào loại máy chủ web bạn đang sử dụng.
đầu ra véc ni
Nhưng trước khi chúng ta có thể đi đến kết luận, tôi muốn xem một số dầu bóng
đầu ra.
Tôi muốn xem đầu ra của lệnh sau khi vòng lặp chuyển hướng diễn ra:
varnishlog -g request -q "ReqUrl eq '/'"
Giả định là sự cố cũng xảy ra trên trang chủ mà chúng tôi đã thêm dưới dạng truy vấn VSL vào dầu bóng
chỉ huy.
tôi nhận thấy của bạn vecni
đầu ra, nhưng tiếc là nó quá hạn chế về đầu ra. dầu bóng
tốt hơn rất nhiều để gỡ lỗi trong khi vecni
Chỉ là.
Kiểm tra giả thuyết
Nếu vòng lặp chuyển hướng thực sự do thiếu nhận thức về giao thức gây ra, chúng ta có thể kích hoạt sự cố như sau:
- Chạy
varnishadm ban obj.status "!=" 0
để làm trống bộ đệm
- Gọi URL HTTP đơn giản của trang web để đảm bảo phiên bản này được lưu vào bộ đệm
- Gọi URL HTTPS của trang web để kiểm tra xem bạn có bị kẹt trong vòng lặp chuyển hướng hay không
Khắc phục sự cố
Nếu tất cả các phép thử cộng lại và giả thuyết được chứng minh, thì giải pháp thực sự khá đơn giản.
Nếu bạn đang sử dụng Apache làm máy chủ web, bạn có thể thêm nội dung sau vào .htaccess
tập tin:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Tiêu đề nối thêm Khác nhau: X-Forwarded-Proto
Nếu không, bạn cũng có thể thêm đoạn mã sau vào tệp VCL của mình:
phụ vcl_backend_response {
if(beresp.http.Vary) {
if(beresp.http.Vary !~ "X-Forwarded-Proto") {
đặt beresp.http.Vary = đặt beresp.http.Vary + ", X-Forwarded-Proto";
}
} khác {
đặt beresp.http.Vary = "X-Forwarded-Proto";
}
}
Thêm X-Forwarded-Proto
đến Thay đổi
tiêu đề sẽ đảm bảo rằng Varnish tạo các đối tượng riêng biệt trong bộ đệm cho HTTP và cho HTTPS.
Tôi cũng cho rằng proxy TLS của bạn thực sự gửi một X-Forwarded-Proto
tiêu đề.
Cập nhật: kiểm tra nhật ký
Sau một số bình luận qua lại, tôi đã nhận được một số nhật ký sâu sắc qua https://Pastebin.com/QzPh1r5R đó giải thích những gì đang xảy ra.
Trong ** << BeReq >> 951078
bạn có thể nhìn thấy X-Forwarded-Proto: http
tiêu đề. Điều này có nghĩa là yêu cầu đã được gửi thông qua một yêu cầu HTTP đơn giản. Loại yêu cầu này sẽ dẫn đến chuyển hướng 301 và nó thực hiện theo các dòng nhật ký sau:
-- Giao thức Beresp HTTP/1.1
-- BerespStatus 301
-- BerespReason đã di chuyển vĩnh viễn
-- BerespHeader Ngày: Thứ năm, ngày 13 tháng 1 năm 2022 08:55:17 GMT
-- Máy chủ BerespHeader: Apache
-- Vị trí BerespHeader: https://[the varnish domain]/
-- Độ dài nội dung BerespHeader: 238
-- Kiểu nội dung BerespHeader: text/html; bộ ký tự = iso-8859-1
-- TTL RFC 120 10 0 1642064118 1642064118 1642064117 0 0 có thể lưu vào bộ đệm
Quá trình chuyển hướng không chỉ diễn ra mà còn được lưu vào bộ nhớ cache trong 120 giây. Thật thú vị khi thấy rằng không có Thay đổi: X-Forwarded-Proto
tiêu đề.
Vào một thời gian sau, các * << Yêu cầu >> 951080
giao dịch bật lên trong nhật ký. Chúng tôi thấy các tiêu đề yêu cầu sau:
- ReqHeader X-Forwarded-Proto: https
- ReqHeader Host: [another varnish domain]
Vì vậy, đây là một yêu cầu HTTPS cho một miền Varnish khác và vì lý do nào đó, nó dẫn đến một lần truy cập bộ đệm trả về một Thay đổi
tiêu đề:
- RespHeader Vary: Mã hóa chấp nhận,Cookie,X-Forwarded-Proto
- VCL_cuộc gọi HIT
- Lượt 886585 90003.966201 10.000000 0.000000
Bạn không chỉ nhìn thấy lần truy cập mà còn có thể kết luận rằng đối tượng đã được đưa vào bộ nhớ cache theo giao dịch 886585
.
Mặc dù thật tốt khi có một Thay đổi
tiêu đề, cái này chứa Bánh quy
giá trị nguy hiểm.Điều này có nghĩa là một đối tượng riêng biệt sẽ được lưu trữ trong bộ đệm cho mọi giá trị cookie có thể được trình bày cho Varnish. Điều này là khá nguy hiểm, vì vậy hãy loại bỏ Bánh quy
từ Thay đổi
tiêu đề và gắn bó với Khác nhau: Chấp nhận-Mã hóa, X-Forwarded-Proto
.
Giao dịch cuối cùng tôi xem xét là * << Yêu cầu >> 951082
. Nó có một X-Forwarded-Proto: https
tiêu đề yêu cầu và sẽ không dẫn đến chuyển hướng 301, nhưng rất tiếc là có.
Các Đánh
thẻ hiển thị một số thông tin thú vị:
- Lượt 951078 82.391648 10.000000 0.000000
Đối tượng bị tấn công, ban đầu được chèn vào bộ nhớ cache theo giao dịch 951078
. Nếu bạn chú ý, đó là cái đầu tiên chúng tôi đề cập. Giao dịch này là giao dịch chỉ HTTP dẫn đến chuyển hướng 301.
Và đó chính xác là đối tượng được trả về. Vì vậy, mặc dù bạn đang yêu cầu nội dung HTTPS, nhưng bạn vẫn bị chuyển hướng và đó là cách bạn kết thúc trong vòng lặp vô tận.
Nếu bạn nhìn vào phản hồi được trả về bởi giao dịch 951082
, bạn không nhìn thấy Thay đổi
tiêu đề:
- RespProtocol HTTP/1.1
- Phản hồi Trạng thái 301
- RespReason Đã di chuyển vĩnh viễn
- RespHeader Ngày: Thứ Năm, ngày 13 tháng 1 năm 2022 08:55:17 GMT
- Máy chủ RespHeader: Apache
- Vị trí RespHeader: https://[the varnish domain]/
- Độ dài nội dung của RespHeader: 238
- Kiểu nội dung RespHeader: text/html; bộ ký tự = iso-8859-1
- RespHeader X-Varnish: 951082 951078
- Người đại diện Tuổi: 37
- RespHeader Via: 1.1 véc ni (Varnish/7.0)
Phần kết luận: Hãy đảm bảo rằng X-Forwarded-Proto
được thêm vào của bạn Thay đổi
tiêu đề. Nó sẽ ngăn chặn việc bị mắc kẹt trong vòng lặp chuyển hướng.