2012-02-23 35 views

Trả lời

22

Dưới đây là một đoạn dựa tắt của một máy chủ tôi có nơi chúng tôi lấy một số dữ liệu tiêu đề từ yêu cầu:

class api(tornado.web.RequestHandler): 
    def initialize(self, *args, **kwargs): 
     self.remote_ip = self.request.headers.get('X-Forwarded-For', self.request.headers.get('X-Real-Ip', self.request.remote_ip)) 
     self.using_ssl = (self.request.headers.get('X-Scheme', 'http') == 'https') 
    def get(self): 
     self.write("Hello " + ("s" if self.using_ssl else "") + " " + self.remote_ip) 
+1

Cần lưu ý một số thông tin cơ bản tại đây. Lý do @James có thể tìm thấy self.request.protocol là không chính xác là một số thiết lập máy chủ (ví dụ: Amazon ELB xử lý SSL, các loại proxy phía máy chủ khác) thay đổi giao thức và IP trước khi chuyển những thứ lên máy chủ của bạn. Sử dụng X-Forwarded-For và các tiêu đề khác được cung cấp bởi các proxy này cho phép bạn tìm ra những gì trình duyệt thực sự yêu cầu. – mikemaccana

+0

Ngoài ra, bạn nên biết rằng khách hàng có thể tự đặt "X-Forwarded-For", dẫn bạn chấp nhận giá trị này làm IP của mình. Vì vậy, bạn chỉ nên sử dụng điều này nếu có một thiết lập thiết lập tiêu đề này, không nói chung. – johndodo

2

Bạn có thể sử dụng logic tương tự như tornado/httpserver.py hoặc chỉ cần tạo tornado.httpserver.HTTPServer() với xheaders=True.

# Squid uses X-Forwarded-For, others use X-Real-Ip 
ip = self.headers.get("X-Forwarded-For", self.remote_ip) 
ip = ip.split(',')[-1].strip() 
ip = self.headers.get(
    "X-Real-Ip", ip) 
if netutil.is_valid_ip(ip): 
    self.remote_ip = ip 
# AWS uses X-Forwarded-Proto 
proto = self.headers.get(
    "X-Scheme", self.headers.get("X-Forwarded-Proto", self.protocol)) 
if proto in ("http", "https"): 
    self.protocol = proto 
Các vấn đề liên quan