2015-10-13 13 views
8

Tôi đã tạo một ứng dụng web Django (1.7) với Nginx, Gunicorn, Django stack và gần đây tôi đã bắt đầu nhận được một số lỗi:Django ERROR (EXTERNAL IP): Tiêu đề HTTP_HOST không hợp lệ: '* .domain.com'

[Django] L ERI (IP NGOẠI HỐI): Tiêu đề HTTP_HOST không hợp lệ: '* .domain.com'. Tên miền được cung cấp không hợp lệ theo RFC 1034/1035.

Sau khi tìm kiếm xung quanh, tôi đã tìm thấy một số phản ứng rằng đề nghị đưa các ký tự đại diện như các host cho phép, ví dụ:

ALLOWED_HOSTS = ['*'] 

Tuy nhiên tôi vẫn nhận được lỗi này.

Dưới đây là thông báo lỗi đầy đủ:

Request repr(): 
<WSGIRequest 
path:/, 
GET:<QueryDict: {}>, 
POST:<QueryDict: {}>, 
COOKIES:{}, 
META:{'HTTP_ACCEPT_ENCODING': 'none', 
'HTTP_CONNECTION': 'close', 
'HTTP_HOST': '*.domain.com', 
'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2)', 
'HTTP_X_FORWARDED_FOR': '11.111.111.11', 
'HTTP_X_FORWARDED_HOST': 'subdomain.domain.com', 
'HTTP_X_REAL_IP': '11.111.111.11', 
'PATH_INFO': u'/', 
'QUERY_STRING': '', 
'RAW_URI': '/', 
'REMOTE_ADDR': '127.0.0.1', 
'REMOTE_PORT': '51349', 
'REQUEST_METHOD': 'GET', 
'SCRIPT_NAME': u'', 
'SERVER_NAME': '127.0.0.1', 
'SERVER_PORT': '9000', 
'SERVER_PROTOCOL': 'HTTP/1.0', 
'SERVER_SOFTWARE': 'gunicorn/19.1.1', 
'gunicorn.socket': <socket._socketobject object at 0x3877fa0>, 
'wsgi.errors': <gunicorn.http.wsgi.WSGIErrorsWraper object at 0x37e6050>, 
'wsgi.file_wrapper': <class 'gunicorn.http.wsgi.FileWrapper'>, 
'wsgi.input': <gunicorn.http.body.Body object at 0x396cc50>, 
'wsgi.multiprocess': False, 
'wsgi.multithread': False, 
'wsgi.run_once': False, 
'wsgi.url_scheme': 'http', 
'wsgi.version': (1, 0)}> 

là một cái gì đó này tôi phải lo ngại về? Am i thiếu cái gì ở đây? Tôi nghĩ bằng cách đặt ký tự đại diện trong các máy chủ được phép, tôi sẽ loại bỏ vấn đề này, nhưng điều đó dường như không đúng.

Mọi trợ giúp sẽ được đánh giá cao.

+0

tôi sẽ không ký tự đại diện chủ nhà cho phép, thay vì sử dụng một danh sách các host thực sự cho phép như [www.domain.com, domain.com]. Ngoài ra cấu hình Nginx của bạn để chấp nhận các yêu cầu này thông qua server_name. – Jingo

+0

@Jingo cảm ơn sự giúp đỡ của bạn và phản hồi nhanh chóng. Tôi đã có các tên miền được thêm trước đó nhưng gặp lỗi này, đó là lý do tại sao tôi thêm ký tự đại diện vào vị trí của nó. Lạ thật. Tôi sẽ đưa nó trở lại như bạn đã đề cập và xem tôi có gặp phải những vấn đề này hay không. – tdsymonds

+0

Tôi hiện đã xóa ký tự đại diện cho phép và vẫn nhận được lỗi này ?! – tdsymonds

Trả lời

2

Các khách hàng được thực hiện một yêu cầu đến máy chủ của bạn đã được gửi HTTP Host tiêu đề sau đây:

Host: *.domain.com 

này không hợp lệ theo các đặc điểm kỹ thuật HTTP - * không được phép trong tiêu đề - do đó Django trả lời với phản hồi HTTP 400 và ghi lại lỗi.

Điều này không liên quan đến nội dung bạn đặt trong cài đặt ALLOWED_HOSTS, trong đó * được cho phép và yêu cầu Django chấp nhận yêu cầu cho bất kỳ tên máy chủ nào (hợp lệ) vẫn sẽ từ chối tên máy chủ không hợp lệ như *.domain.com).

Như những người khác đã chỉ ra trong các nhận xét, tuy nhiên, bạn chỉ nên cấu hình nginx để chấp nhận kết nối cho các máy chủ cụ thể (server_name) để yêu cầu đó thậm chí không đạt được Django.

1

ISSUE: gunicorn (máy chủ ứng dụng Django) của bạn đang nhận được tên máy chủ không hợp lệ.

khi yêu cầu được gửi tới máy chủ (NginX) và máy chủ HTTP (hoặc tác nhân người dùng) trống, nginx đặt máy chủ HTTP thành vớ gunicorn.


Giải pháp: Thêm/cập nhật một chỉ thị trong conf nginx của bạn (nginx.conf hoặc sites-enabled/<your-site>.conf) từ:

proxy_set_header Host $http_host; 

đến (nếu bạn không có nó thiết lập, chỉ cần thêm sau),

proxy_set_header Host $host; 

có thể đặt nó bên trong location, trên thị proxy_pass:

server { 
    listen 8000; 
    server_name 0.0.0.0; 

    location/{ 
      proxy_set_header Host $host; 
      include proxy_params; 
      proxy_pass http://unix:/<your-path>/yourproject.sock; 

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