Подстановочные знаки в файле хоста Windows

289

Я хочу настроить свою локальную машину разработки так, чтобы любые запросы *.localперенаправлялись на localhost. Идея состоит в том, что когда я разрабатываю несколько сайтов, я могу просто добавить vhosts в вызываемый Apache site1.localи site2.localт. Д., И разрешить им все разрешить localhost, в то время как Apache соответственно обслуживает другой сайт.

Я на Windows XP.

Я пытался добавить

127.0.0.1       *.local

к моему c:\windows\system32\drivers\etc\hostsфайлу тоже пробовал:

127.0.0.1       .local

Ни один из которых, кажется, не работает.

Я знаю, что могу установить их на разных номерах портов, но это очень сложно, так как трудно вспомнить, какой порт какой.

Я не хочу настраивать локальный DNS-сервер или что-то сложное, какие-либо предложения?

EvilPuppetMaster
источник
1
Пожалуйста, не стесняйтесь использовать anysubdomain.reconn.co.uk как обходной путь (если вы онлайн), который всегда будет указывать на ваш локальный хост (см. Мой ответ ниже).
Пол Гримшоу
как насчет скрипта, который анализирует apache vhosts ServerName и обновляет файл hosts?
Элвис Чиотти
1
Я считаю, что * .local имеет особую семантику, и вы должны использовать что-то несуществующее. Я использую * .dev, так как не думаю, что это реально.
WraithKenny

Ответы:

431

Акриловый DNS Proxy (бесплатный, с открытым исходным кодом) делает свою работу. Он создает прокси-сервер DNS (на вашем собственном компьютере) со своим собственным файлом hosts. Файл hosts принимает подстановочные знаки.

Скачать с официального сайта

http://mayakron.altervista.org/support/browse.php?path=Acrylic&name=Home

Настройка Acrylic DNS Proxy

Чтобы настроить Acrylic DNS Proxy, установите его по приведенной выше ссылке, затем перейдите по ссылке:

  1. Начало
  2. программы
  3. Акриловый DNS-прокси
  4. конфиг
  5. Редактировать файл пользовательских хостов (AcrylicHosts.txt)

Добавьте следующие строки в конце файла:

127.0.0.1   *.localhost
127.0.0.1   *.local
127.0.0.1   *.lc

Перезапустите сервис Acrylic DNS Proxy:

  1. Начало
  2. программы
  3. Акриловый DNS-прокси
  4. конфиг
  5. Перезапустите Акриловый Сервис

Вам также необходимо изменить настройки DNS в настройках сетевого интерфейса:

  1. Начало
  2. Панель управления
  3. Сеть и Интернет
  4. Сетевые соединения
  5. Свойства подключения по локальной сети
  6. TCP / IPv4

Установите «Использовать следующий адрес DNS-сервера»:

Preferred DNS Server: 127.0.0.1

Если вы затем объедините этот ответ с ответом jeremyasnyder (используя VirtualDocumentRoot), вы можете автоматически настроить домены / виртуальные хосты, просто создав каталог.

Петах
источник
13
Просто чтобы прояснить, «файл пользовательских хостов» - это AcrylicHosts.txt, а не AcrylicConfiguration.ini. Может быть, это должно быть очевидно, но это меня немного смутило.
mhenry1384
@Petah - эта точная конфигурация работала для меня с подстановочными доменами, но она просто остановилась, и я не могу понять, почему. Все запросы возвращают «Эта страница недоступна». Перезапустил Acryllic, сбросил все кеши ... что еще может быть?
SB2055
1
@ SB2055 проверьте правильность настроек DNS в свойствах сети.
Петах
Следует отметить, что Acrylic не очень подходит для ситуаций, когда ваша сетевая среда часто меняется. Общедоступный DNS-сервер Google не будет разрешать имена реальных компьютеров в вашей сети ... и вы можете исправить это для одной сети, но вы все равно не сможете разрешить внутренние имена компьютеров при переходе в другую сеть. Это может быть особенно больно. Но я также должен отметить, что я не знаю всего, что нужно знать об акриле.
Алекс Дресько
Если это делается внутри виртуальной машины, то PrimaryServerAddressв конфигурации (а не в файле hosts) следует изменить значение 8.8.8.8по умолчанию на то, которое предоставляет хост. В VirtualBox это так 10.0.2.3.
Mightyiam
80

Чтобы ответить на ваш вопрос, вы не можете использовать подстановочные знаки в файле hosts под Windows.

Однако, если вы хотите изменить только файл hosts, чтобы новые сайты работали .... вы можете настроить свой Apache следующим образом, и вам не нужно продолжать редактировать его конфигурацию:

http://postpostmodern.com/instructional/a-smarter-mamp/

По сути, краткая сводка, основанная на моих настройках, добавьте в файл apache.conf следующее:

 LoadModule vhost_alias_module modules/mod_vhost_alias.so

 NameVirtualHost *:80

  <Directory "/xampp/sites">
      Options Indexes FollowSymLinks Includes ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all 
  </Directory>

  <VirtualHost *:80>
      VirtualDocumentRoot c:/xampp/sites/%-1/%-2+/
  </VirtualHost>

Это позволяет мне добавить запись вроде:

127.0.0.1       test.dev

а затем создайте каталог c: \ xampp \ sites \ dev \ test и поместите туда необходимые файлы, и он просто работает.

Другой вариант - использовать <Directory>теги в apache.conf и ссылаться на страницы из http: // localhost / project / .

jeremyasnyder
источник
Можете ли вы использовать подстановочные знаки на OSX?
cjm2671
Да, используя Bind - clintberry.com/2011/…
Райан Шумахер
30

Я не думаю, что это возможно.

В любом случае вам придется изменять записи виртуального корня apache каждый раз, когда вы добавляете новый сайт и местоположение, поэтому синхронизировать новое имя с файлом vhost Windows не составляет особого труда.

Обновление: пожалуйста, проверьте следующий ответ и комментарии к этому ответу. Этому ответу 6 лет, и он больше не правильный.

Biri
источник
3
Но при использовании Nginx нет необходимости изменять конфигурационный файл Nginx, чтобы добавить новую группу доменов второго уровня * .localhost. Итак, это минус файла hosts.
sergzach
8
Просто отметим, что когда у вас многоязычный веб-сайт, у вас может быть <VirtualHost> с ServerAlias *.mydomain.localhost( *являющимся кодом языка), так что вам не придется редактировать httpd.conf каждый раз, когда вы добавляете новый язык; но вам все равно нужно добавить поддомен в файл hosts, отсюда и актуальность вопроса выше.
Бенджамин
10
Динамические виртуальные хосты являются ключевым словом здесь и поддерживаются большинством серверов, то есть Apache и Nginx. Так что нет, вам определенно не нужно прикасаться к вашему Apache-config каждый раз, когда вы создаете проект.
Валентин Клингхаммер
2
У нас также могут быть виртуальные хосты с подстановочными знаками, это hostsдействительно только файл
ericn
6

Чтобы добавить к замечательным предложениям уже здесь, XIP.IO - это фантастический DNS-сервер с подстановочными знаками, который доступен для всех.

      myproject.127.0.0.1.xip.io  -- resolves to -->   127.0.0.1
  other.project.127.0.0.1.xip.io  -- resolves to -->   127.0.0.1
   other.machine.10.0.0.1.xip.io  -- resolves to -->   10.0.0.1

(Возможность указывать адреса без обратной связи является фантастической для тестирования сайтов на устройствах iOS, где вы не можете получить доступ к файлу хостов.)

Если вы объедините это с некоторыми настройками Apache, упомянутыми в других ответах, вы можете потенциально добавить VirtualHosts с нулевой настройкой .

Саймон Ист
источник
И это работает для членов вашей команды в случае IP в вашей локальной сети. Им не нужно устанавливать локальный DNS-сервер с тем же файлом hosts.
Тобиас Умман
4

Я нашел сообщение об использовании файла Windows Hosts котором также говорится: «Не допускаются подстановочные знаки».

Раньше я только добавлял дополнительные записи в файл hosts, потому что (как уже было сказано), это не так уж много дополнительной работы, когда вы уже редактируете конфигурационный файл apache.

Кевин Хакансон
источник
Чем дольше вы создаете файл hosts, тем дольше он обрабатывает запросы. Не очень хорошее решение, если у вас много записей.
cchamberlain
4

Редактирование файла hosts менее проблемно при запуске «ipconfig / flushdns» из командной строки Windows вместо перезагрузки компьютера.

Джо
источник
1
он не сбрасывает кэш DNS браузера, а окно. Поэтому он должен ждать 20-30 минут, пока браузер не выпустит DNS-кеширование.
Джейкоб Мелвад Йенсен
3

Вы можете попросить своего сетевого администратора настроить домен для вас (например, evilpuppetmaster.hell) и использовать там подстановочный знак, чтобы все (* .evilpuppetmaster.hell ') разрешалось по вашему IP.

Стю Томпсон
источник
1
Спасибо, но это на домашнем devserver, DNS или сетевой администратор недоступны.
EvilPuppetMaster
Хорошо, может быть, у вас есть доступ к домену или кто-то знает, кто делает? Например: * .evilpuppetmatser.arealdomain.com
Стю Томпсон
На самом деле, нет. Несмотря на это, это домашний компьютер, поэтому он получает новый IP-адрес каждый раз, когда мой маршрутизатор подключается к Интернету. Внешний DNS-сервер не поможет.
EvilPuppetMaster
1
1) Нет причины, по которой * .evilpuppetmatser.arealdomain.com не может разрешить 127.0.0.1, 2) я не предлагаю внешний DNS-сервер. Я предлагаю вам использовать поддомен на реальном домене. Технически, любой может разрешить server.evp.arealdomain.com.
Стю Томпсон
3
Есть также некоторые общедоступные, такие как * .127.0.0.1.xip.io и другие
Дейв Джеймс Миллер
3

У нас это работает с использованием подстановочного DNS на нашем локальном DNS-сервере: добавьте Aзапись что-то вроде*.local -> 127.0.0.1

Я думаю, что в настройках вашей сети должен быть выбранный суффикс домена в списке поиска суффиксов домена для компьютеров в сети, поэтому вы можете заменить .localего внутренним доменом вашей компании (например .int), а затем добавить субдомен, .localhost.intчтобы сделать его понятным. для чего это.

Таким образом, *.localhost.intбудет разрешено 127.0.0.1для всех в сети, и настройки файла конфигурации для всех разработчиков будут "просто работать", если конечные точки зависают от этого субдомена, например site1.localhost.int, site2.localhost.intЭто в значительной степени схема, которую мы ввели.

dnsmasq также выглядит красиво, но я еще не пробовал: http://ihaveabackup.net/2012/06/28/using-wildcards-in-the-hosts-file/

Мэтью Скелтон
источник
2

Вы можете попробовать AngryHosts , который предоставляет способ поддержки подстановочных знаков и регулярных выражений. На самом деле, это программное обеспечение для улучшения файлов и управления хостами.
Больше возможностей можно увидеть @ http://angryhosts.com/features/

iloahz
источник
2

Я использую DNSChef, чтобы сделать это.

https://thesprawl.org/projects/dnschef/

Вы должны загрузить приложение, в Linux или Mac вам нужен Python для его запуска. У Windows есть свой собственный exe.

Вы должны создать INI-файл с вашими записями DNS, например

[A]
*.google.com=192.0.2.1
*.local=127.0.0.1
*.devServer1.com=192.0.2.3

Затем вы должны запустить приложение DNS с правами администратора

sudo python dnschef.py --file myfile.ini -q

или в окнах

runas dnschef.exe --file myfile.ini -q

Наконец, вам нужно настроить в качестве единственного DNS локальную хост-среду (сеть, интерфейс, DNS или аналогичную или в linux /etc/resolv.conf).

это оно

casivaagustin
источник
2

Я сделал этот простой инструмент, чтобы занять место хозяев. Регулярные выражения поддерживаются. https://github.com/stackia/DNSAgent

Пример конфигурации:

[
    {
        "Pattern": "^.*$",
        "NameServer": "8.8.8.8"
    },
    {
        "Pattern": "^(.*\\.googlevideo\\.com)|((.*\\.)?(youtube|ytimg)\\.com)$",
        "Address": "203.66.168.119"
    },
    {
        "Pattern": "^.*\\.cn$",
        "NameServer": "114.114.114.114"
    },
    {
        "Pattern": "baidu.com$",
        "Address": "127.0.0.1"
    }
]
Stackia
источник
0

Я не смог найти запрет на запись, но по соглашению файл хостов Windows близко следует файлу хостов UNIX, и вы не можете помещать в этот файл ссылки на имена хостов с подстановочными знаками.

Если вы читаете справочную страницу, там написано:

DESCRIPTION
     The hosts file contains information regarding the known hosts on the net-
     work.  For each host a single line should be present with the following
     information:

           Internet address
           Official host name
           Aliases

Хотя это говорит,

     Host names may contain any printable character other than a field delim-
     iter, newline, or comment character.

это не так с практической точки зрения.

По сути, код, который просматривает файл / etc / hosts, не поддерживает подстановочный знак.

Обходной путь заключается в том, чтобы создать все записи заранее, возможно, использовать скрипт, чтобы поместить пару сотен записей одновременно.

BENC
источник
0

@petah и Acrylic DNS Proxy - лучший ответ, и в конце он ссылается на возможность создания нескольких сайтов с использованием Apache, который @jeremyasnyder описывает чуть ниже ...

... однако в нашем случае мы тестируем мультитенантную хостинговую систему, и поэтому большинство доменов, которые мы хотим протестировать, идут на одно virtualhostи то же , в то время как пара других направляется в другое место.

Так что в нашем случае вы просто используете подстановочные знаки regex в ServerAliasдирективе, вот так ...

ServerAlias *.foo.local
oucil
источник
0

Вот общая конфигурация для тех, кто пытается достичь цели (подстановочные знаки в среде разработки, т. Е. XAMPP - в этом примере предполагается, что все сайты указывают на одну и ту же кодовую базу)

файл hosts (добавить запись)

файл:% SystemRoot% \ system32 \ drivers \ etc \ hosts

127.0.0.1   example.local

Конфигурация httpd.conf (включить vhosts)

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

сохранить как угодно. pac, где вы хотите, а затем загрузить файл в сеть браузера> прокси> настройки авто_конфигурации (перезагрузите, если вы измените это)

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*example.local")) {
    return "PROXY example.local";
  }
  return "DIRECT";
}
Даниэль Джорди
источник
Не сработало, пока не знаю о PAC, но эта строка 'return "PROXY example.local";' не вернет прокси ip: порт для использования браузером в качестве прокси?
Ион
0

Для этого вы можете использовать echoipdns ( https://github.com/zapty/echoipdns ).

При запуске echoipdns local все запросы для поддоменов .local перенаправляются на 127.0.0.1, поэтому любой домен с xyz.local и т. Д. Преобразуется в 127.0.0.1. Вы можете использовать любой другой суффикс, также просто замените local именем, которое вы хотите.

Echoipdns является еще более мощным, когда вы хотите использовать свой URL-адрес с других компьютеров в сети, вы все равно можете использовать его с нулевой конфигурацией.

Например, если IP-адрес вашей машины 192.168.1.100, вы можете использовать доменное имя xyz.192-168-1-100.local, которое всегда будет разрешаться до 192.168.1.100. Эту магию делают echoipdns, просматривая IP-адрес во второй части имени домена и возвращая тот же IP-адрес в DNS-запросе. Вам нужно будет запустить echoipdns на машине, с которой вы хотите получить доступ к удаленной системе.

echoipdns также может быть настроен как автономный прокси-сервер DNS, поэтому, просто указав на этот DNS, вы теперь можете использовать все перечисленные выше преимущества, не выполняя специальную команду каждый раз, и вы даже можете использовать ее с мобильных устройств.

Таким образом, это существенно упрощает разработку DNS на основе подстановочного домена для локальной и командной среды.

echoipdns работает на Mac, Linux и Windows.

ПРИМЕЧАНИЕ: я автор для echoipdns.

ARVA
источник
0

Конфигурация автоматического субдомена config nginx с помощью Acrylic DNS Proxy

файл auto.conf для вашей папки сайтов nginx

server {
    listen 80;
    server_name ~^(?<branch>.*)\.example\.com;
    root /var/www/html/$branch/public;  

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_log  /var/log/nginx/$branch.error.log error;

    sendfile off;

    client_max_body_size 100m;

    location ~ \.php$ {
       try_files $uri /index.php =404;
       fastcgi_pass php-fpm:9000;
       fastcgi_index index.php;
       fastcgi_buffers 16 16k;
       fastcgi_buffer_size 32k;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

Добавьте в файл Acrylic hosts 127.0.0.1 example.com *.example.comи перезапустите сервис Acrylic. $ branch - ваше имя субдомена.

Установить вместо root / var / www / html / $ branch / public; путь вашего проекта

Даврон Ачилов
источник
0

Это можно сделать с помощью Pi-Hole , просто отредактируйте "/ etc / hosts" и перезапустите службу dns.

nano /etc/hosts
pihole restartdns

Пример:

127.0.1.1       raspberrypi
192.168.1.1     w1.dev.net
192.168.1.2     w2.dev.net
192.168.1.3     w3.dev.net
davidjimenez75
источник
-1

Вы можете использовать динамический DNS-клиент, такой как http://www.no-ip.com . Затем с помощью внешнего DNS-сервера CNAME * .mydomain.com перейдите на mydomain.no-ip.com.


источник
2
это разрешило бы ваш внешний ip, и обычно это просто вызвало бы страницу конфигурации вашего маршрутизатора / модема
Сэм
-1

Хотя вы не можете добавить подобный шаблон, вы можете добавить полный список сайтов, которые вам нужны, по крайней мере для тестирования, которые мне подходят, в файле hosts вы просто добавляете:

127.0.0.1 site1.local
127.0.0.1 site2.local
127.0.0.1 site3.local
...

BlackTigerX
источник
Я думаю, что оригинальный плакат пытается избежать хлопот этого шага.
Саймон Ист