ใน / etc / hosts / file บน Linux / OSX ฉันจะใช้ไวด์การ์ดในโดเมนย่อยได้อย่างไร?


169

ฉันจำเป็นต้องทดสอบโดเมนย่อยบน localhost ของฉัน ฉันจะได้อย่างมีประสิทธิภาพมีผลมาจากการเพิ่มนี้*.localhost.comของฉัน/etc/hosts/ไฟล์?

หากไม่สามารถทำได้ฉันจะแก้ไขปัญหานี้ได้อย่างไร ฉันต้องการทดสอบโดเมนย่อยของไวลด์การ์ดในเซิร์ฟเวอร์ของฉัน มันเป็นผู้พัฒนา Django เซิร์ฟเวอร์ Django dev สามารถจัดการโดเมนย่อยได้หรือไม่? ซอฟต์แวร์ / การกำหนดเส้นทางอื่น ๆ สามารถให้ผลลัพธ์ที่ฉันต้องการได้ไหม?


1
เป็นของ superuser หรือไม่
Paul R

ฉันรู้ว่าผู้คนบอกว่ามันเป็นไปไม่ได้! แต่ฉันจะทำอย่างไรต่อไป! อะไรคือสิ่งที่อยู่นอก / etc / hosts / ฉันสามารถใช้เพื่อรับผลกระทบ ฉันกำลังทดสอบเซิร์ฟเวอร์การพัฒนา
MikeN


เนื่องจากคำตอบส่วนใหญ่มุ่งเน้นที่คำถามแรกของคุณ (สัญลักษณ์ย่อยโดเมน localhost) ฉันจะตอบคำถามรองของคุณเป็นความคิดเห็น: ใช่เซิร์ฟเวอร์ Django dev สามารถจัดการโดเมนย่อย localhost ได้อย่างสมบูรณ์แบบคุณเพียงแค่ต้องโน้มน้าวเบราว์เซอร์และระบบปฏิบัติการของคุณ เพื่อส่งปริมาณการใช้งาน (โดยใช้วิธีแก้ไขปัญหาด้านล่าง)!
hheimbuerger

คำตอบ:


43

ฉันเขียนพร็อกซี DNS ใน Python มันจะอ่านรายการไวด์การ์ดใน / etc / hosts ดูที่นี่: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


มันสมบูรณ์แบบ! ฉันกำลังมองหาวิธีแก้ปัญหาแบบง่าย ๆ เช่นนี้มาเป็นเวลานาน (ทำงานกับ OSX Mavericks BTW)
Billy Moon

2
ตอนนี้ถ้าเราทำได้แค่นี้เท่านั้นpip install:)
metakermit

1
ฉันติดตั้งสิ่งนี้ทำทุกอย่างและรัน แต่ไม่ได้บล็อกไซต์
DisplayName

ไม่สามารถลงคะแนนได้เพียงพอ ฉันต้องการสิ่งนี้ตลอดไปสะดุดกับอัญมณีของคำถามและคำตอบนี้และฉันเป็นแฮ็กเกอร์ Python เล็กน้อยและนี่คือชิ้นอาหารอันโอชะที่เรียบร้อย ขอบคุณสำหรับการแบ่งปัน!
Farley

152

ติดตั้งdnsmasq (ฉันทำสิ่งนี้บนเดสก์ท็อป Linux ทั้งหมดของฉันเป็นแคช DNS ต่อไป) ในการdnsmasq.confเพิ่มบรรทัด:

address=/localhost.com/127.0.0.1

7
ยอดเยี่ยม! หมายเหตุสำหรับผู้ใช้ Mac มันง่ายมาก ๆ : 1. sudo port install dnsmasq2. แก้ไข/opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc

17
OSX with brew: เหมือนข้างบน แต่ชงติดตั้ง dnsmasq
Matt Humphrey

1
fyi ก่อ> พอร์ต (ข้อเสนอแนะ @MattHumphrey)
electblake

1
ตัวอย่างนี้ใช้ไม่ได้สำหรับฉันอาจเป็นเพราะฉันใช้vagrantup.comสำหรับการให้บริการในท้องถิ่น ไม่ต้องกังวลฉันเปลี่ยน IP เป็นที่ถูกต้องแล้ว192.168.50.11แต่ DNS ไม่ได้รับการแก้ไข ความคิดเห็นใดเป็นตัวอย่างนี้ถูกต้องสำหรับ IP ของ "ไม่ใช่ -12.0.0.1"?
ไบรอัน

6
สุดยอดเคล็ดลับ สำหรับเดสก์ท็อป Ubuntu 14.04 (ซึ่งเรียกใช้ dnsmasq ตามค่าเริ่มต้น) ให้สร้างไฟล์ชื่อ/etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confและวางบรรทัดaddress=/localhost.com/127.0.0.1ไว้จากนั้นรีสตาร์ท
user38397

60

ไม่สามารถระบุ wildcard ใน/etc/hostsไฟล์ได้ ระบุชื่อโฮสต์ที่ต้องการอย่างชัดเจนหรือตั้งค่าเซิร์ฟเวอร์ชื่อท้องถิ่นด้วยกฎที่เหมาะสม


15

คุณต้องตั้งค่าเซิร์ฟเวอร์ DNS และให้ไคลเอนต์แต่ละรายใช้เพื่อการแก้ปัญหา เซิร์ฟเวอร์เองสามารถเป็นสิ่งที่เป็น "ไฟ" เป็นdnsmasqหรือเป็นหนักเป็นห่วง


+1 สำหรับ dnsmasq ซึ่งได้รับการบันทึกไว้อย่างดีและใช้งานง่าย
David Schmitt

dnsmasq ไม่สามารถทำได้
DisplayName

พฤติกรรมส่วนใดที่อธิบายไว้ใน--address=ส่วนของหน้า dnsmasq.conf ไม่ครอบคลุมกรณีการใช้ที่อธิบายข้างต้น
เจอรัลด์รวงผึ้ง

11

Simple Workflow (ไม่จำเป็นต้องติดตั้งอะไร)

ฉันชอบที่จะสร้างไฟล์ PAC สำหรับสิ่งนั้นและทำให้เบราว์เซอร์ของฉันใช้งานได้

ขั้นตอนที่ 1:สร้างไฟล์เช่น*.proxy.pac*บางแห่ง (ฉันใช้$homeโฟลเดอร์ของฉัน)

ขั้นตอนที่ 2:วางรหัสนี้ (ตัวอย่างคือพอร์ต 8000):

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*localhost")) {
    return "PROXY localhost:8000";
  }
  return "DIRECT";
}

ขั้นตอนที่ 3 : ทำให้เบราว์เซอร์ของคุณใช้ไฟล์ PAC นี้

วิดีโอ Youtube สำหรับ PAC & Firefox

ขั้นตอนที่ 4 : ตอนนี้คุณสามารถทดสอบแอปของคุณโดยการเข้าถึง:http://mysubdomain.localhost/

ขั้นตอนที่ 5:สนุก :)


3
อาจเป็นเรื่องที่ควรกล่าวถึงว่าจะมีผลกับเบราว์เซอร์ของคุณเท่านั้น โปรแกรมอื่น ๆ (เช่นwgetจะไม่ได้รับผลกระทบจากสิ่งนี้) นั่นไม่ได้เป็นปัญหา แต่อาจจะเป็นการดีกว่าถ้าพูดถึงเรื่องนี้
Willem Van Onsem

หากคุณไปเส้นทาง. pac และคุณกำลังใช้เซิร์ฟเวอร์ node.js คุณจะประหลาดใจเมื่อเห็นว่าreq.urlตอนนี้เป็น URL ที่แน่นอน สิ่งนี้เกิดขึ้นเนื่องจากสมมติฐานคือคุณต้องการเขียนพร็อกซีเซิร์ฟเวอร์จริง แต่เป็นที่น่าแปลกใจหากคุณใช้เทคนิคนี้เพื่อหยุดการเพิ่ม / etc / โฮสต์รายการสำหรับการดีบัก FYI สำหรับผู้ที่อาจไปในเส้นทางเดียวกันกับที่ฉันทำ
Tom Boutell

5

ฉันได้จัดทำโปรเจคเก่าของฉัน:

https://github.com/airtonix/avahi-aliases

ความต้องการ:

  • linux โดยที่ avahi และ python-avahi สามารถติดตั้งได้
  • คุณใช้ได้กับโดเมน. local (avahi ไม่รองรับประเภทอื่น)

ข้อดีมากกว่าการใช้ dnsmasq หรือ python dns proxy:

  • ผู้ใช้ avahi / bonjour อื่น ๆ ในเครือข่ายท้องถิ่นของคุณสามารถแก้ไขนามแฝงที่คุณสร้างและประกาศเครือข่าย (ให้คุณอนุญาตให้เข้าถึงพอร์ต 5353)

4

โซลูชันที่ใช้ DNS นี้ทำงานได้อย่างสมบูรณ์ในกรณีของฉันโดยไม่จำเป็นต้องติดตั้งอะไร: https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)


โซลูชั่นที่ยอดเยี่ยมสำหรับ Mac OSX
iDev247

ลิงก์ที่ใช้งานไม่ได้โปรดอัพเดทลิงค์ทางออกของคุณหรือตอบคำถามนี้ไม่ทางใดก็ทางหนึ่ง ไชโย
Eric Hodonsky

เสร็จสิ้น (เพิ่มการสำรองข้อมูล)
Fedir RYKHTIK

3

/etc/hostsคุณไม่สามารถใช้ตัวแทนใน

ดูที่นี่สำหรับคำแนะนำที่ดีเกี่ยวกับวิธีการทำให้สำเร็จใน OS X โดยใช้ BIND เซิร์ฟเวอร์ DNS ในตัว แต่ไม่ใช้งานและ Apache


5
Apache ไม่มีส่วนเกี่ยวข้องกับโดเมนย่อย
ผู้ไม่ประสงค์ออกนาม

3

หากคุณต้องการใช้dnsmasqร่วมกับNetworkManagerคุณสามารถ (หรือแม้กระทั่งต้อง?) เริ่มdnsmasqจากNetworkManagerการเพิ่ม

dns=dnsmasq

/etc/NetworkManager/NetworkManager.confไปยัง จากนั้นการกำหนดค่า dnsmasq ไปที่/etc/NetworkManager/dnsmasq.confหรือตอบ/etc/NetworkManager/dnsmasq.d/สนอง


2

คำตอบสั้น ๆ :

ไฟล์ / etc / hosts / ของคุณจะไม่ยอมให้คุณใช้อักขระตัวแทนหรือหมายเลขพอร์ต คุณจะต้องสร้างหนึ่งรายการสำหรับแต่ละโดเมนย่อยของคุณ


2
อะไรให้คุณระบุหมายเลขพอร์ต ไม่ใช่ DNS AFAIK
ptman

2

คำตอบสั้น ๆ คือคุณทำไม่ได้ คำตอบอีกต่อไปคือคุณจะต้องชัดเจนในสิ่งที่คุณปรารถนาที่จะบรรลุจริงเพราะอาจมีวิธีที่ดีกว่าและวิธีที่แตกต่างเพื่อให้บรรลุ

สำหรับเว็บโฮสติ้ง (ฉันไม่เคยเห็นมันใช้เป็นอย่างอื่น) ทำใน DNS ร่วมกับเว็บเซิร์ฟเวอร์ที่ให้บริการโฮสต์เสมือน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับระเบียน wildcard DNS (Wikipedia) และบทความWildcard ที่โฮสต์กับ Apache และ Bindสำหรับ Linux โดยใช้ bind และ Apache

ที่แย่ที่สุดคุณสามารถใช้เซิร์ฟเวอร์ DNS ภายในที่ฉันคิดได้


2

งานทั่วไปสำหรับเรื่องนี้คือการจับคู่ไดเรกทอรีกับโดเมนย่อย วิธีที่ตรงไปตรงมามากสำหรับการผนวกรายการบนพื้นฐานไดเรกทอรีเข้ากับไฟล์โฮสต์โดยอัตโนมัติ:

#! / usr / bin / หลาม

นำเข้าระบบปฏิบัติการ

hostsFile = open ("/ etc / hosts", "a +");

บรรทัด = hostsFile.readlines ()

สำหรับชื่อไฟล์ใน os.listdir ('/ opt / subdomainDirs'):

    entryExists = เท็จ
    สำหรับสายในสาย:
        ถ้าชื่อไฟล์ในบรรทัด:
            entryExists = True  

    ถ้าไม่ใช่รายการมีอยู่:
        hostsFile.write ("127.0.0.1" + ชื่อไฟล์ + ".localhost \ n");

2

ขอบคุณ tschundeee สำหรับสิ่งที่ฉันคิดว่าเป็นคำตอบที่ดีที่สุดสำหรับปัญหานี้หวังว่าฉันจะแสดงความคิดเห็นได้ แต่นี่คือการกำหนดค่าทั้งหมดสำหรับผู้ที่พยายามบรรลุเป้าหมายดั้งเดิม (สัญลักษณ์ทั้งหมดชี้ไปที่ codebase เดียวกัน - ติดตั้งอะไรเลย , XAMPP)

ไฟล์โฮสต์ (เพิ่มรายการ)

ไฟล์: / etc / hosts (ไม่ใช่ Windows)

127.0.0.1   example.local

การกำหนดค่า httpd.conf (เปิดใช้งาน vhosts)

ไฟล์: /XAMPP/etc/httpd.conf

# Virtual hosts
Include etc/extra/httpd-vhosts.conf

การกำหนดค่า httpd-vhosts.conf

ไฟล์: XAMPP / etc / extra / httpd-vhosts.conf

<VirtualHost *:80>
    ServerAdmin admin@example.local
    DocumentRoot "/path_to_XAMPP/htdocs"
    ServerName example.local
    ServerAlias *.example.local
#    SetEnv APP_ENVIRONMENT development
#    ErrorLog "logs/example.local-error_log"
#    CustomLog "logs/example.local-access_log" common
</VirtualHost>

รีสตาร์ท apache

สร้างไฟล์ pac:

บันทึกเป็น any.pac ทุกที่ที่คุณต้องการแล้วโหลดไฟล์ในเครือข่าย> พร็อกซี> การตั้งค่า auto_configuration ของเบราว์เซอร์ (โหลดซ้ำหากคุณแก้ไขสิ่งนี้)

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*example.local")) {
    return "PROXY example.local";
  }
  return "DIRECT";
}

2

dnsmasq ใช้งานได้สำหรับฉันยกเว้นฉันต้องทำขั้นตอนเพิ่มเติม

นี่คือขั้นตอนการเต็มรูปแบบ:

  1. เติม/etc/resolv.confด้วยบรรทัดต่อไปนี้

    nameserver 127.0.0.1
    
  2. เพิ่มบรรทัดต่อไปนี้ลงใน /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. รีสตาร์ท dnsmasq


สิ่งนี้จะไม่ทำงานหาก distro ของคุณใช้ netplan (Ubuntu 18.04 ฉันกำลังมองคุณอยู่)
MrMesees
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.