Di file / etc / hosts / saya di Linux / OSX, bagaimana saya melakukan subdomain wildcard?


170

Saya perlu menguji sub-domain di localhost saya. Bagaimana saya dapat secara efektif mendapatkan hasil ini untuk ditambahkan *.localhost.comke /etc/hosts/file saya ?

Jika tidak memungkinkan, bagaimana saya mengatasi masalah ini? Saya perlu menguji sub-domain wildcard pada server lokal saya. Ini adalah Django devserver, bisakah server Django dev menangani sub-domain? Bisakah beberapa software / routing memberi saya hasil akhir yang saya inginkan?


1
Milik superuser?
Paul R

Saya tahu orang mengatakan itu tidak mungkin! Tetapi bagaimana saya melakukannya? Apa itu sesuatu di luar / etc / hosts / yang bisa saya gunakan untuk mendapatkan efek. Saya sedang menguji server pengembangan.
MikeN


Karena sebagian besar jawaban berfokus pada pertanyaan pertama Anda (wildcard subdomain localhost), saya akan menjawab pertanyaan sekunder Anda sebagai komentar: ya, server dev Django sangat mampu menangani subdomain localhost, Anda hanya perlu meyakinkan browser dan OS Anda mengirim lalu lintas dengan caranya sendiri (menggunakan salah satu dari berbagai solusi di bawah)!
hheimbuerger

Jawaban:


44

Saya telah menulis proksi dns dengan Python. Ini akan membaca entri wildcard di / etc / hosts. Lihat di sini: https://github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py


Ini sempurna! Saya telah mencari solusi sederhana seperti ini untuk waktu yang lama (Bekerja pada OSX Mavericks BTW)
Billy Moon

2
sekarang, jika kita hanya bisa pip installmelakukannya :)
metakermit

1
Saya menginstal ini, melakukan segalanya dan menjalankannya, tetapi tidak memblokir situs.
DisplayName

Tidak dapat cukup mengungguli ini. Saya membutuhkan ini selamanya, menemukan permata ini dari pertanyaan dan jawaban, dan saya sedikit peretas Python, dan ini adalah berita gembira yang rapi. Terima kasih telah berbagi!
Farley

153

Instal dnsmasq (saya melakukan ini di semua desktop Linux saya sebagai cache DNS). Di dnsmasq.conftambahkan baris:

address=/localhost.com/127.0.0.1

7
Cemerlang! Catatan untuk pengguna Mac, ini benar-benar sederhana: 1. sudo port install dnsmasq2. sunting /opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc

17
OSX dengan brew: sama seperti di atas tetapi brew instal dnsmasq
Matt Humphrey

1
fyi brew> port (saran @MattHumphrey)
electblake

1
Contoh ini tidak berfungsi untuk saya, mungkin karena saya menggunakan vagrantup.com untuk penyajian lokal. Jangan khawatir, saya sudah mengubah IP ke yang benar 192.168.50.11tetapi DNS tidak menyelesaikan. Ada ide, apakah contoh ini benar untuk IP "non-127.0.0.1"?
Brian

6
Tip yang bagus. Untuk desktop Ubuntu 14.04 (yang menjalankan dnsmasq secara default), buat file bernama /etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.confdan letakkan baris address=/localhost.com/127.0.0.1di dalamnya, lalu mulai ulang.
user38397

60

Tidak mungkin untuk menentukan wildcard dalam /etc/hostsfile. Baik tentukan nama host yang diperlukan secara eksplisit atau sebagai alternatif, buat server nama lokal dengan aturan yang sesuai.


15

Anda perlu mengatur server DNS dan meminta setiap klien menggunakannya untuk resolusi. Server itu sendiri dapat berupa sesuatu yang "ringan" seperti dnsmasq atau seberat BIND .


+1 untuk dnsmasq, yang benar-benar didokumentasikan dengan baik dan mudah digunakan
David Schmitt

dnsmasq tidak dapat melakukan ini.
DisplayName

Bagian mana dari perilaku yang dijelaskan di --address=bagian halaman manual dnsmasq.conf yang tidak mencakup use case yang dijelaskan di atas?
Gerald Combs

11

Alur Kerja Sederhana (tidak perlu menginstal apa pun)

Saya pribadi suka membuat file PAC untuk itu dan membuat browser saya cukup menggunakannya.

Langkah 1: buat file misalnya: di *.proxy.pac*suatu tempat (saya menggunakan $homefolder saya )

Langkah 2: rekatkan kode ini (contohnya dengan port 8000):

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

Langkah 3 : Jadikan Browser Anda menggunakan file PAC ini.

Video Youtube untuk PAC & Firefox

Langkah 4 : Sekarang Anda dapat menguji aplikasi Anda dengan mengakses:http://mysubdomain.localhost/

Langkah 5: Nikmati :)


3
Mungkin perlu disebutkan bahwa ini hanya akan mempengaruhi browser Anda. Program lain (seperti wget, tidak akan terpengaruh oleh ini). Itu bukan masalah semata, tetapi mungkin lebih baik untuk menyebutkan ini.
Willem Van Onsem

Jika Anda memilih rute .pac dan Anda mengimplementasikan server node.js, Anda akan terkejut melihat bahwa req.urlitu sekarang adalah URL absolut. Ini dilakukan karena asumsinya adalah Anda ingin menulis server proxy yang sebenarnya, tetapi mengejutkan jika Anda sampai pada teknik ini hanya sebagai cara untuk berhenti menambahkan entri / etc / hosts untuk debugging. FYI untuk mereka yang mungkin pergi jalan yang sama saya lakukan.
Tom Boutell

5

Saya sudah merapikan proyek lama saya:

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

Persyaratan:

  • linux tempat avahi dan python-avahi dapat diinstal
  • Anda setuju dengan domain lokal (avahi tidak mendukung jenis lainnya)

Keuntungan dibandingkan menggunakan dnsmasq atau python dns proxy:

  • pengguna avahi / bonjour lain di jaringan lokal Anda dapat menyelesaikan alias yang Anda buat dan umumkan ke jaringan (asalkan Anda mengizinkan akses ke port 5353)


3

Anda tidak dapat menggunakan wildcard di /etc/hosts.

Lihat langkah-langkah di sini untuk mengetahui cara menyelesaikan pada OS X menggunakan BIND, server DNS bawaan tetapi tidak aktif, dan Apache.


5
Apache tidak ada hubungannya dengan subdomain.
Anonim

3

Jika Anda ingin menggunakan dnsmasqdengan NetworkManagerAnda dapat (atau bahkan harus?) Mulai dnsmasqdari NetworkManagerdengan menambahkan

dns=dnsmasq

untuk /etc/NetworkManager/NetworkManager.conf. Kemudian konfigurasi dnsmasq pergi ke /etc/NetworkManager/dnsmasq.confatau /etc/NetworkManager/dnsmasq.d/resp.


2

Jawaban singkat:

/ Etc / hosts / file Anda tidak akan membiarkan Anda menggunakan wildcard atau nomor port. Anda harus membuat satu entri untuk setiap subdomain Anda


2
Apa yang memungkinkan Anda menentukan nomor port? Bukan DNS AFAIK.
ptman

2

Jawaban singkatnya adalah Anda tidak. Jawaban yang lebih panjang adalah Anda harus lebih jelas tentang apa yang ingin Anda capai, karena mungkin ada cara yang lebih baik, dan cara yang berbeda untuk mencapainya.

Untuk web-hosting (Saya tidak pernah melihatnya digunakan sebaliknya) dilakukan dalam DNS bersama dengan server web hosting virtual hosting. Untuk informasi lebih lanjut tentang catatan DNS wildcard (Wikipedia), dan artikel Wildcard hosting dengan Apache dan Bind untuk Linux menggunakan bind dan Apache.

Paling buruk, Anda bisa menggunakan server DNS lokal saya kira.


2

Tugas umum untuk subjek ini adalah memetakan direktori ke subdomain. Cara yang sangat mudah untuk itu adalah menambahkan entri berbasis direktori secara otomatis ke file hosts:

#! / usr / bin / python

impor os

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

lines = hostsFile.readlines ()

untuk fileName di os.listdir ('/ opt / subdomainDirs'):

    entryExists = Salah
    untuk baris-baris:
        jika fileName sejalan:
            entryExists = Benar  

    jika tidak entryExists:
        hostsFile.write ("127.0.0.1" + fileName + ".localhost \ n");

2

Terima kasih tschundeee untuk apa yang saya anggap sebagai jawaban akhir untuk masalah ini, berharap saya bisa berkomentar tapi di sini adalah konfigurasi total untuk mereka yang mencoba mencapai tujuan asli (wildcard semua menunjuk ke basis kode yang sama - tidak menginstal apa-apa, dev environment ie , XAMPP)

file hosts (tambahkan entri)

file: / etc / hosts (non-windows)

127.0.0.1   example.local

Konfigurasi httpd.conf (aktifkan vhosts)

file: /XAMPP/etc/httpd.conf

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

Konfigurasi httpd-vhosts.conf

file: 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>

restart apache

buat file pac:

simpan sebagai apa pun.pac di mana pun Anda inginkan dan kemudian muat file di jaringan browser> proxy> pengaturan konfigurasi auto_ (muat ulang jika Anda mengubahnya)

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

2

dnsmasq bekerja untuk saya, kecuali saya harus membuat beberapa langkah tambahan.

Inilah prosedur lengkapnya:

  1. Lanjutkan /etc/resolv.confdengan baris berikut

    nameserver 127.0.0.1
    
  2. Tambahkan baris berikut ke /etc/dnsmasq.conf

    listen-address=127.0.0.1
    address=/localhost.localdomain/127.0.0.1
    address=/localhost/127.0.0.1
    
  3. Mulai ulang dnsmasq


Ini tidak akan berfungsi jika distro Anda menggunakan netplan (ubuntu 18.04 Saya sedang melihat Anda)
MrMesees
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.