Làm thế nào để máy chủ web biết liệu bạn có đang sử dụng truy cập địa chỉ IP trực tiếp không?


64

Một số máy chủ web, khi được truy cập bằng địa chỉ IP của họ, sẽ trả về lỗi không cho phép truy cập địa chỉ IP trực tiếp.

Tôi đã tự hỏi đôi khi nó hoạt động như thế nào. Ý tôi là, không phải trình duyệt luôn giải quyết địa chỉ IP và kết nối với nó? Không phải là "Truy cập địa chỉ IP trực tiếp" chỉ bỏ qua DNS? Làm thế nào để máy chủ từ xa thậm chí biết bạn bỏ qua DNS?


2
Như tôi nhớ, những gì anh ta thực sự yêu cầu đã được thêm vào giao thức http từ rất sớm, để cung cấp cho các máy chủ ảo trên cùng một máy chủ thực.
JDługosz

3
Về cơ bản, đó là cùng một quy trình cho phép một máy chủ phân biệt giữa các máy chủ ảo khác nhau. Máy chủ thực ánh xạ URL tới một trong các máy chủ ảo của nó. Nhiều máy chủ không có dự phòng cho một URL chưa được khai thác, theo thiết kế hoặc mặc định.
Manngo

Bạn có thể bỏ qua DNS nhưng tránh lỗi này nếu bạn tạo một mục trong tệp máy chủ của mình cho tên miền được đề cập. Trình duyệt của bạn sẽ tìm kiếm tên miền và sẽ đưa nó vào tiêu đề Host: nhưng không có truy vấn DNS nào được thực hiện do mục nhập tệp máy chủ.
Monty Harder

Câu trả lời cho những loại câu hỏi này thường là bởi vì bạn đã nói với họ .
Thomas

Câu trả lời:


91

Để trả lời câu hỏi của bạn về cách nó biết , nó phải làm với những gì trình duyệt của bạn gửi cho máy chủ.

Bạn đúng rằng hệ thống luôn phân giải nó thành địa chỉ IP, nhưng trình duyệt sẽ gửi URL mà bạn đã cố truy cập trong tiêu đề HTTP.

Đây là một tiêu đề mẫu mà tôi tìm thấy trực tuyến, được sửa đổi để trông giống như bạn đã sử dụng Firefox trên Windows và nhập apple.comvào thanh địa chỉ:

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Đây là tiêu đề sẽ như thế nào nếu bạn sử dụng địa chỉ IP của nó:

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Cả hai thứ này sẽ được gửi đến cùng một địa chỉ IP qua một ổ cắm, nhưng trình duyệt sẽ cho máy chủ biết những gì nó truy cập.

Tại sao? Bởi vì các máy chủ web có cùng địa chỉ IP có thể lưu trữ nhiều trang web và cung cấp các trang khác nhau cho mỗi trang. Nó không thể phân biệt ai muốn trang nào theo địa chỉ IP bởi vì tất cả chúng đều có cùng một trang - nhưng nó có thể phân biệt chúng bằng tiêu đề HTTP.


7
Ahh, có ý nghĩa hơn nhiều bây giờ! Về cơ bản, trình duyệt gửi tới IP tiêu đề bằng IP hoặc tên miền và trang web đưa ra giả định về điều đó. Vì vậy, thực sự, những hạn chế là dễ dàng để bỏ qua?
Joseph A.

7
Đó không phải là hạn chế mà bạn bỏ qua, chỉ là bạn không chơi bóng và bạn sẽ nhận được một số kết quả lạ.
iAdjunc 13/03/2016

Các yêu cầu HTTP này là những gì bạn nhận được nếu bạn đang sử dụng proxy. Không có proxy, thông tin đến trong hosttiêu đề. Xem ví dụ này .
0xFE

2
bytec0de: Một phần khác của điều này là cấu hình máy chủ web thường sẽ được thiết lập dựa trên tên máy chủ. Gói IP chỉ định địa chỉ IP, phân đoạn TCP chỉ định số cổng và tiêu đề HTTP chỉ định tên máy chủ. Vì vậy, các máy chủ thông thường được cấu hình để nói "nếu máy khách / trình duyệt yêu cầu example.com, thì hãy cung cấp cho họ cái này." Chúng có thể được thiết lập để trả lời địa chỉ IP hoặc ký tự đại diện (phản hồi bất cứ điều gì), nhưng nhiều người chỉ sao chép các ví dụ và nhiều ví dụ có sẵn dựa trên tên miền do trình duyệt cung cấp.
TUYỆT VỜI 13/03/2016

14
@ bytec0de Đó không phải là một hạn chế . Giống như sử dụng đúng số điện thoại, nhưng phần mở rộng sai - bạn đã gọi đúng tòa nhà, nhưng không phải đúng người. Và lý do cho việc giới thiệu của nó cũng khá giống với điện thoại - nó cho phép bạn lưu trữ nhiều trang web riêng biệt trên cùng một địa chỉ IP (và cổng TCP). Ví dụ: máy chủ phát triển của chúng tôi đã lưu trữ hàng trăm trang web riêng biệt cùng một lúc và rất nhiều giải pháp lưu trữ web sử dụng cùng một cách tiếp cận ("đăng ký tên miền, trỏ đến địa chỉ IP của chúng tôi, chúng tôi sẽ giải quyết phần còn lại") .
Luaan

21

Với giao thức HTTP 1.1 (phiên bản HTTP 1.0 trước đó đã bị lỗi thời khá lâu, do đó, không có khả năng được sử dụng bởi bất kỳ phiên bản gần đây nào của trình duyệt), hosttiêu đề đã được giới thiệu. Đối với HTTP 1.1, đó là một dòng tiêu đề bắt buộc phải được trình duyệt cấp . Tên miền được trình duyệt bao gồm trong dòng đó, vd Host: example.com. Vì vậy, máy chủ web biết trang web nào trình duyệt muốn truy cập từ dòng đó. Vì một máy chủ web có thể hỗ trợ hàng tá trang web, nên dòng đó rất quan trọng để xác định trang web nào mà trang được yêu cầu nằm trên đó. Giả sử trình duyệt muốn truy cập trang chủ cho một trang web trên example.com, Nó sẽ đưa ra dòng sau cho máy chủ khi kết nối với máy chủ:

GET / HTTP/1.1

Dòng đó chỉ định trình duyệt muốn lấy tài liệu gốc, nghĩa là "/" cho trang web. Nếu bạn muốn truy cập /somedir/testpage.html, GET /somedir/testpage.htmlsẽ ở dòng "get". Dòng này sẽ được theo sau bởi dòng dưới đây:

Host: example.com

Vì vậy, nếu máy chủ web hỗ trợ các trang web example.com, someothersite.com, yetanothersite.org, v.v., nó biết rằng nó sẽ trả về trang chính cho example.com. Nếu nó không có dòng đó hoặc không có tên miền được liệt kê trong Hostdòng đó, thì nó không biết trang chủ của trang web nào sẽ được trả lại. Vì vậy, nó có thể trả về một thông báo lỗi, thay vào đó, hoặc trả lại trang chủ cho một trang web "mặc định" cho máy chủ.

Bạn có thể đưa ra các lệnh tương tự mà trình duyệt gặp phải khi sử dụng giao thức telnet , ví dụ: telnet example.com 80từ dấu nhắc shell Linux hoặc cửa sổ Apple OS X Terminal , để kết nối với cổng HTTP mặc định, cổng 80 - xem Kiểm tra quyền truy cập vào trang web bằng PuTTY để biết các bước để làm như vậy với PuTTY trên hệ thống Windows.


3
Chỉ cần lưu ý: tiêu đề máy chủ cũng được sử dụng trong HTTP 1.0, nó không bắt buộc . HTTP 1.1 làm cho trường bắt buộc. Trong thực tế, nhiều máy chủ HTTP 1.0 đơn giản là không hoạt động nếu trình duyệt không gửi tiêu đề máy chủ (vì tất cả các lý do đã nêu ở trên), vì vậy hầu hết các trình duyệt đều gửi nó.
Luaan

6

Điều này là do Host:tiêu đề HTTP. Điều này khá hữu ích để lưu trữ nhiều trang web trên cùng một địa chỉ IP. Ví dụ: http://www.k7dxs.net/http://www.philipgrimes.com/ đều trên cùng một địa chỉ IP. Tuy nhiên, vì Host:tiêu đề, họ có thể hiển thị hai trang web khác nhau.

Đối với HTTPS, như @Tooth Brush đã chỉ ra, họ sử dụng Chỉ định tên máy chủ TLS vì tiêu đề Máy chủ là một phần của yêu cầu được mã hóa và máy chủ không biết cung cấp chứng chỉ nào mà không có chứng nhận này.

Thử nghiệm thú vị: Nhận dữ liệu giả mạo cho Firefox (Tôi chưa thể tìm thấy một ứng dụng tương đương với Chrome) và bắt đầu giả mạo. Mở http://slipstation.com/ và chỉnh sửa Host:tiêu đề trong yêu cầu là http://www.zombo.com/ . Bạn sẽ thấy một trang web có thể quen thuộc, nơi mọi thứ đều có thể.


Trên thực tế, các trang web sử dụng Chỉ định Tên Máy chủ . Không có cách nào để biết trang web nào sẽ hiển thị nếu cả hai trang web được lưu trữ trên cùng một máy chủ qua HTTPS mà không có SNI vì máy chủ không biết nên sử dụng chứng chỉ nào.
Bàn chải đánh răng

Ồ! thật thú vị. Thử nghiệm của tôi vẫn hoạt động chứ?
Duncan X Simpson

Có, nếu bạn tìm thấy hai trang web được lưu trữ trên cùng một địa chỉ IP qua HTTP.
Bàn chải đánh răng

Nhưng không phải HTTPS là những gì tôi đã hỏi.
Duncan X Simpson

Không, nó không nên hoạt động trên HTTPS. Nếu có, có một lỗ hổng bảo mật trong máy chủ web.
Bàn chải đánh răng

5

Máy chủ web có thể được cấu hình để chỉ chấp nhận kết nối đến một tên miền hoặc tên miền phụ cụ thể. Nó có thể được lưu trữ nhiều tên miền.

Những gì máy chủ web làm khi địa chỉ IP trực tiếp được sử dụng là cấu hình. Trong trường hợp của Apache, theo mặc định, nó sẽ đi đến vhost có tên đầu tiên trong số các trang web được kích hoạt, được sắp xếp theo dạng số.

Đây là phần có liên quan nhất trong tài liệu Apache mà tôi đã tìm thấy, sau khi tìm kiếm nhanh:

https://httpd.apache.org/docs/cản/vhosts/name-basing.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.