“ ชื่อโฮสต์ที่ระบุไม่ถูกต้องสำหรับเซิร์ฟเวอร์นี้” หมายความว่าอย่างไร


64

ฉันใช้งานเว็บไซต์ Drupal 8 และเมื่อฉันเรียกดูหน้าใด ๆ ฉันจะได้รับหน้าขาวธรรมดาพร้อมข้อความแสดงข้อผิดพลาดต่อไปนี้

ชื่อโฮสต์ที่ระบุไม่ถูกต้องสำหรับเซิร์ฟเวอร์นี้

สิ่งนี้หมายความว่า? ฉันจะแก้ไขได้อย่างไร


2
หากคุณกำลังประสบปัญหานี้ด้วยการกำหนดค่าสภาพแวดล้อมการพัฒนาท้องถิ่นดูวิธีแก้ไขปัญหาที่นี่
Patrick Kenny

คำตอบ:


78

ข้อความผิดพลาดนี้มาจากคุณลักษณะที่ถูกเพิ่มเข้าไปใน Drupal 8 เพื่อป้องกันการโจมตี HTTP โฮสต์ส่วนหัว คุณสมบัตินี้ยังได้อธิบายไว้ในบันทึกการเปลี่ยนแปลงที่สร้างขึ้นสำหรับโปรแกรมแก้ไข

โดยพื้นฐานแล้วมันเป็นไปได้ที่จะปลอมแปลงส่วนหัว HTTP Hostเพื่อวัตถุประสงค์สามานย์และหลอกลวง Drupal ให้ใช้ชื่อโดเมนที่แตกต่างกันในระบบย่อยต่าง ๆ (โดยเฉพาะการสร้างลิงค์) กล่าวอีกนัยหนึ่งส่วนหัวของโฮสต์ HTTP นั้นจำเป็นต้องได้รับการพิจารณาว่าเป็นอินพุตของผู้ใช้และไม่น่าเชื่อถือ

เพื่อต่อสู้กับสิ่งนี้การตั้งค่าใหม่$settings['trusted_host_patterns']ได้ถูกเพิ่มใน Drupal 8 เพื่อกำหนดค่ารายการชื่อโฮสต์ "ที่เชื่อถือได้" ที่เว็บไซต์สามารถเรียกใช้ได้ การตั้งค่าต้องเป็นอาร์เรย์ของรูปแบบนิพจน์ทั่วไปโดยไม่มีตัวคั่นแสดงชื่อโฮสต์ที่คุณต้องการอนุญาตให้เรียกใช้

ตัวอย่างเช่นหากคุณใช้งานเว็บไซต์ของคุณจากชื่อโฮสต์เดียว "www.example.com" คุณควรเพิ่มสิ่งนี้ในการตั้งค่าของคุณ (โดยปกติจะอยู่ที่./sites/default/settings.php):

$settings['trusted_host_patterns'] = array(
  '^www\.example\.com$',
);

หมายเหตุ^, และ\. $เหล่านี้เป็นPCRE ไวยากรณ์ สิ่งเหล่านี้หมายความว่าคุณต้องการจับคู่ "www.example.com" อย่างแม่นยำโดยไม่มีอะไรพิเศษที่จุดเริ่มต้นและจุดสิ้นสุดและจุดควรถือว่าเป็นจุดไม่ใช่อักขระตัวแทน

หากคุณกำลังเรียกใช้จาก "example.com" ให้ใช้:

$settings['trusted_host_patterns'] = array(
  '^example\.com$',
);

หากคุณต้องการเรียกใช้เว็บไซต์ที่มีหลายโดเมนและ / หรือโดเมนย่อยและไม่ได้ทำการเปลี่ยนเส้นทาง URL แบบบัญญัติการตั้งค่าของคุณจะมีลักษณะดังนี้:

$settings['trusted_host_patterns'] = array(
  '^example\.com$',
  '^.+\.example\.com$',
  '^example\.org',
  '^.+\.example\.org',
);

สิ่งนี้ทำให้ไซต์สามารถวิ่งออกจากตัวแปรทั้งหมดของ example.com และ example.org โดยมีโดเมนย่อยทั้งหมดรวมอยู่ด้วย

เมื่อคุณปรับ$settings['trusted_host_patterns']ค่าที่เหมาะสมแล้วคุณควรจะสามารถเรียกดูไซต์ของคุณอีกครั้ง

คุณสามารถตรวจสอบสถานะของการตั้งค่าโฮสต์ที่เชื่อถือได้ของคุณจากหน้ารายงานสถานะซึ่งอยู่ที่ผู้ดูแลระบบ / รายงาน / สถานะ

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

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


5
ฉันเป็นหนึ่งในผู้แต่งของโปรแกรมแก้ไขและยังเขียนแบบร่างดั้งเดิมของ Change Record สำหรับโปรแกรมแก้ไข (ซึ่งเป็นที่มาของข้อความข้างต้นจำนวนมาก) คำถามและคำตอบนี้คือให้ข้อความแสดงข้อผิดพลาด "googlability สูง" ในกรณีที่ทุกคนพบ โปรดเพิ่มคำตอบของคุณเองหากคุณคิดว่าคุณสามารถอธิบายการตั้งค่านี้ได้ดีขึ้น เราอาจลงเอยด้วยการสร้าง CW นี้
mpdonadio

มีการกำหนดพันล้านเมื่อเซิร์ฟเวอร์ Drupal ไม่สามารถเข้าถึงได้โดยตรง แต่อยู่หลังพร็อกซีย้อนกลับและนี่เป็นเพียงความรำคาญ ควรมีกลไกการเลือกไม่เข้าร่วม

ฉันเชื่อว่าตอนนี้มีความพยายามที่จะตั้งค่ามันโดยอัตโนมัติในตัวติดตั้ง แต่มันก็ถูกลบอีกครั้งในตอนนี้ ไม่มีการตรวจสอบความถูกต้องหากคุณไม่ได้ตั้งชื่อโฮสต์ที่เชื่อถือได้ นอกจากนี้ผมเพียงแค่นี้ทำให้การเชื่อมต่อระหว่าง mpdonadio และ MPD :)
Berdir

ใช่การกำหนดค่าอัตโนมัติถูกลบออกจากแพทช์ที่ได้รับมอบหมาย ขณะนี้เป็น "เลือกใช้ แต่เราจะเตือนคุณหากยังไม่ได้ตั้งค่า" มีการติดตามคือdrupal.org/node/2404259เพื่อตั้งค่าในตัวติดตั้ง @Berdir ฉันมีวิกฤตข้อมูลทางอินเทอร์เน็ตเมื่อไม่นานมานี้และเมื่อฉันกลายเป็น mod ที่นี่ฉันไม่ต้องการเปลี่ยนชื่อเล่นของฉัน :) ชื่อผู้ใช้ git ของฉันถ้าต่างกันเช่นกัน ...
mpdonadio

เมื่อฉันใช้ '^ theming \ .dev $' ฉันมีข้อผิดพลาดนี้: ข้อความแสดงข้อผิดพลาด UnexpectedValueException: Host "localhost" ที่ไม่น่าเชื่อถือใน Symfony \ Component \ HttpFoundation \ Request-> getHost () บรรทัดที่ 1221 ของ core / ผู้ขาย / symfony / http -foundation / Symfony / ตัวแทน / HttpFoundation / Request.php)
Axel Briche

6

สำหรับการติดตั้ง localhost คุณสามารถใช้รหัสต่อไปนี้ในไฟล์ settings.php ของคุณ

$settings['trusted_host_patterns'] = array(
   '^localhost$','^YOUR_IP_ADDRESS$'
 );

3

สิ่งนี้เกิดขึ้นเนื่องจากtrusted_host_patternsตัวแปรในไฟล์การตั้งค่าของคุณ หากคุณกำลังทำงานกับสภาพแวดล้อมท้องถิ่นและคุณต้องการแทนที่สิ่งนี้ให้กำหนดหัวข้อต่อไปนี้ในsettings.local.phpไฟล์ของคุณ:

/*
 * Drupal Trusted Host Patterns
 */
$settings['trusted_host_patterns'] = [];

หรือรูปแบบทั่วไปเพิ่มเติม:

$settings['trusted_host_patterns'] = [ '.*' ];

หรือเฉพาะเจาะจงมากขึ้นสำหรับสภาพแวดล้อมท้องถิ่น :

$settings['trusted_host_patterns'] = array(
  '^172\.20.\0.\3$',
  '^localhost$',
);

เป็นโซลูชันที่ง่ายที่สุด แต่ไม่แนะนำให้ใช้เนื่องจากคุณควรตั้งค่าที่เหมาะสมเพื่อหลีกเลี่ยงการปลอมแปลงส่วนหัว HTTP Host เพื่อวัตถุประสงค์ที่ไม่จำเป็น หากเว็บไซต์ของคุณทำงานเฉพาะในพื้นที่ของคุณคุณควรจะทำเช่นนั้น

ดู: การตั้งค่าใหม่สำหรับการกำหนดค่าชื่อโฮสต์ที่เชื่อถือได้


1
คุณควรมี upvotes เพิ่มเติมสำหรับคำตอบนี้เนื่องจากคำจำกัดความการใช้ไฟล์ settings.local.php ที่เหมาะสม การตั้งค่าเหล่านี้อาจไม่ได้กำหนดไว้ใน settings.php มันมีจุดประสงค์เพื่อให้ไฟล์การตั้งค่าที่แตกต่างกันสำหรับสภาพแวดล้อมในท้องถิ่นของคุณซึ่งสามารถเปิด / ปิดด้วย 3 อักขระ ลิงค์หรือข้อมูลบางอย่างเกี่ยวกับการตั้งค่าในท้องถิ่นอาจได้รับคะแนนเสียงมากขึ้น
หรี่แสงที่

2

ปัญหานี้จะเกิดขึ้นหากคุณมี

<VirtualHost *:443>

เมื่อคุณควรมี

<VirtualHost *:80>

ตั้งค่าในการตั้งค่าที่ไม่ใช่ ssl (เช่นสำหรับสภาพแวดล้อม dev / การทดสอบ) และพยายามเข้าถึงไซต์บนพอร์ต 80


0

นี่เป็นเพราะการกำหนดค่าโฮสต์ที่เชื่อถือได้ของเซิร์ฟเวอร์ 'trusted_host_patterns'สามารถผลิตเมื่อคุณเปลี่ยนชื่อโดเมนหรือ เมื่อต้องการแก้ไข probleme เพิ่มโดเมนใหม่ของคุณไปยังDRUPAL_ROOT/sites/SITE_FOLDER/settings.php(Ex: sites/defaults/settings.php)

ตัวอย่าง: ชื่อโดเมน = newdomain.com

$settings['trusted_host_patterns'] = array(
  '^newdomain.com\.loc$',
  '^www\.newdomain.com\.loc$',
);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.