จะไปยังเว็บไซต์บนเซิร์ฟเวอร์ที่ใช้ร่วมกันโดยใช้ที่อยู่ IP ได้อย่างไร


18

ฉันมีคำถามสองสามข้อโปรดช่วย:

กำปั้นฉันสามารถเข้าถึงการค้นหาของ Google เพียงแค่พิมพ์http://74.125.224.211เพราะนี่คือที่อยู่ IP ที่ส่งคืนโดย nslookup

อย่างไรก็ตามฉันไม่สามารถทำได้ด้วยที่อยู่ IP ที่ส่งคืนจาก www.yahoo.com ฉันจะไปที่หน้าค้นหาของ Yahoo ด้วย IP ของมันได้อย่างไร

อีกตัวอย่างหนึ่งhttp://www.allaboutcircuits.comจะแก้ไข68.233.243.63โดยเซิร์ฟเวอร์ DNS แต่ถ้าฉันไปhttp://68.233.243.63ฉันจะได้รับ "Hello world!"

ประการที่สองด้วยเหตุผลบางอย่างมีสิ่งผิดปกติกับ resolvers DNS กับเว็บโฮสติ้งบริการของฉัน(มันจะไม่ได้รับการแก้ไข !!) ดังนั้นคำสั่งเช่น

get_file_contents("http://www.allaboutcircuits.com");

จะกลับมา php_network_getaddresses: getaddrinfo failed: Name or service not known

ฉันจะแก้ไขสิ่งนี้ด้วยที่อยู่ IP ได้อย่างไร

68.233.243.63

ฉันหมายถึงอย่างใดอย่างหนึ่งแนบพารามิเตอร์ชื่อโฮสต์ HTTP เพื่อget_file_contents()?

ฉันต้องการที่จะแก้ปัญหานี้ในด้านของตัวเอง (ในรหัสของฉัน) ไม่มีการแก้ไขปัญหา / การปรับแต่งจะทำโดยผู้ดูแลเซิร์ฟเวอร์


9
อ่านเกี่ยวกับเซิร์ฟเวอร์เสมือนและวิธีที่โฮสต์เดียวสามารถโฮสต์เว็บไซต์ได้หลายเว็บไซต์
wallyk

ฉันคิดว่ามีเหตุผลบางอย่างที่คุณไม่สามารถใช้ชื่อโดเมนได้ใช่ไหม
Isaac Rabinovitch

@Isaac Rabinovitch: user1502776 บอกว่า "มีบางอย่างผิดปกติกับ DNS resolvers กับบริการเว็บโฮสติ้งของฉัน (จะไม่ได้รับการแก้ไข !!)" และ "ฉันต้องการที่จะแก้ปัญหานี้ด้วยตัวเอง (ในรหัสของฉัน) ไม่มีการแก้ไขปัญหา / จะทำการปรับโดยผู้ดูแลเซิร์ฟเวอร์ "
Bavi_H

3
หากผู้ดูแลเซิร์ฟเวอร์ของคุณเป็นคนโง่คุณต้องไปหาผู้ให้บริการเว็บโฮสติ้งรายอื่น
Michael Hampton

คำตอบ:


16

ในสคริปต์ PHP ของคุณเมื่อคุณเข้าถึงด้วยที่อยู่ IP คุณจะต้องส่งHost:ส่วนหัวตามคำขอด้วยชื่อโดเมนที่ถูกต้อง

คำถามเกี่ยวกับ Stack Overflow อธิบายวิธีการใช้งาน: /programming/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call


10

ดังที่ wallyk กล่าวว่าเป็นเซิร์ฟเวอร์เสมือน

ใช้ตัวอย่างนี้สำหรับ apache

<VirtualHost *:80>
ServerName example2.com
DocumentRoot C:/www/example2.com
</VirtualHost>

<VirtualHost *:80>
ServerName example.com
DocumentRoot C:/www/example.com
</VirtualHost>

ใน c: \ www \ example.com สร้างไฟล์ดัชนีโดยระบุว่า "Hello World! example.com"

ใน c: \ www \ example2.com สร้างไฟล์ดัชนีโดยระบุว่า "Hellow World! example2.com"

และเปลี่ยนไฟล์โฮสต์ของคุณเป็น

127.0.0.1 example.com
127.0.0.1 example2.com

จากนั้นไปที่http://example.com จากนั้นไปที่http://example2.com

นั่นคือวิธีที่คุณสามารถมีหลายเว็บไซต์ต่อหนึ่ง IP

ดังนั้นโดยทั่วไปคำตอบก็คือคุณจะไม่สามารถรับไซต์นั้นจาก IP ได้


ฉันได้รับจุดซึ่งเป็น IP เพียงอย่างเดียวไม่เพียงพอ แต่มีคำสั่ง PHP ที่ใช้ IP และชื่อโฮสต์ที่ฉันให้เพื่อดึงหน้าเว็บระยะไกลหรือไม่ คำสั่งไม่ควรสืบค้น DNS
user1502776

4
แม้ว่าสิ่งนี้อาจมีความถูกต้องทางเทคนิค แต่ก็ไม่ได้ตอบคำถาม คำถามกำลังถามถึงวิธีการขอเว็บไซต์เฉพาะที่มีชื่อโฮสต์ที่รู้จักจากเซิร์ฟเวอร์ที่มี IP ที่รู้จักโดยไม่ต้องแก้ไขที่อยู่ IP ผ่าน DNS โดยอัตโนมัติโดยใช้สคริปต์ PHP ไม่ได้ถามว่าจะหาชื่อโฮสต์ที่สอดคล้องกับ IP ที่กำหนดได้อย่างไร ความคิดเห็นของ wallyk นั้นมีความเกี่ยวข้องมากกว่าเนื่องจากลิงก์ของเขามีข้อมูลเกี่ยวกับHostส่วนหัวที่จำเป็นสำหรับเซิร์ฟเวอร์เพื่อแยกความแตกต่างระหว่างเว็บไซต์ที่โฮสต์และให้บริการที่ถูกต้อง
บ๊อบ

5

คุณบอกว่าคุณต้องการระบุทั้งชื่อโฮสต์และที่อยู่ IP ด้วยตนเองแทนที่จะใช้เซิร์ฟเวอร์ DNS ที่อยู่นอกการควบคุมของคุณ ดูที่ความคิดเห็นที่เอกสาร file_get_contentsฉันเห็นความเห็นมีการแก้ไขปัญหาที่คล้ายกันโดยการสร้างบริบทที่มีส่วนหัว Host: ที่จำเป็น บางสิ่งเช่นนี้

$context = stream_context_create(array('http' => array('header' => 'Host: www.allaboutcircuits.com')));
$data = file_get_contents('http://68.233.243.63/', 0, $context);

แน่นอนว่าข้อเสียของการระบุทั้งชื่อโฮสต์และที่อยู่ IP ด้วยตนเองคือหากที่อยู่ IP มีการเปลี่ยนแปลงในอนาคต (ตัวอย่างเช่นหากไซต์ย้ายไปยังผู้ให้บริการโฮสต์รายใหม่) รหัสของคุณอาจหยุดทำงานจนกว่า คุณปรับปรุงที่อยู่ IP ด้วยตนเอง


2

ที่อยู่ IP เพียงอย่างเดียวไม่เพียงพอที่จะระบุไซต์ที่คุณต้องการไปเมื่อโฮสต์เสมือนหลายแห่งกำลังทำงานอยู่บนพอร์ต / เซิร์ฟเวอร์เดียวกัน ในกรณีดังกล่าวคุณต้องระบุส่วนหัวโฮสต์ในคำขอ HTTP ที่ระบุชื่อเซิร์ฟเวอร์ คุณสามารถทำได้โดยตรงผ่าน telnet ไปยังพอร์ต 80:

$ telnet 68.233.243.63 80
Trying 68.233.243.63...
Connected to 68.233.243.63.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.allaboutcircuits.com

โดยที่คุณพิมพ์คำสั่ง telnet และบรรทัด GET และโฮสต์จากนั้นรับซอร์สโค้ด HTML ที่ส่งคืนจากเซิร์ฟเวอร์

หรือคุณสามารถใช้ curl ที่คุณเพิ่มส่วนหัวโดยเฉพาะ (ด้วยการ-Hตั้งค่าสถานะ)

curl 68.233.243.63 -H "Host: www.allaboutcircuits.com"

1

ประการที่สองด้วยเหตุผลบางอย่างมีบางอย่างผิดปกติกับ DNS resolvers กับบริการเว็บโฮสติ้งของฉัน (จะไม่ได้รับการแก้ไข !!)

คุณสามารถใช้เซิร์ฟเวอร์ DNS อื่นในฝั่งไคลเอ็นต์ในกรณีที่ไม่ใช่โฮสต์เว็บ —8.8.8.8 และ 8.8.8.6 ดำเนินการโดย Google และ 4.4.4.2 เป็นสแตนด์บายทั่วไป Namebenchจะช่วยให้คุณค้นหาเร็วที่สุด อีกวิธีหนึ่งคุณสามารถใช้บริการพร็อกซีบางประเภท (ฉันใช้งาน VPS หรือใช้ Tor แต่มีตัวเลือกอื่น ๆ )

เนื่องจากนี่คือ PHP ตัวเลือกที่ง่ายยิ่งกว่าก็คือการเรียกใช้โค้ดบนระบบอื่น กากตะกอนไม่สามารถบำรุงรักษาได้


ดูเหมือนว่าเขาจะอยู่ในโฮสต์ที่ใช้ร่วมกันและไม่สามารถแก้ไข DNS ได้ซึ่งเป็นสาเหตุที่เขามีข้อแม้ "ฉันต้องการแก้ปัญหานี้ด้วยตัวเอง (ในรหัสของฉัน) ไม่มีการแก้ไขปัญหา / การปรับแต่งจะทำโดยผู้ดูแลเซิร์ฟเวอร์ " ฉันไม่คิดว่าเขาจะสามารถแก้ไข DNS ได้ . .
เออร์นี่

1
เขาสามารถใช้เซิร์ฟเวอร์ dns สำรองในฝั่งไคลเอ็นต์เพื่อทดสอบ หากผู้ให้บริการพื้นที่เว็บของเขาตั้งค่าโฮสต์ไม่ถูกต้องเขาต้องมีผู้ให้บริการพื้นที่เว็บรายอื่น
Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.