Windows主机文件中的通配符


289

我想设置本地开发计算机,以便将任何请求*.local重定向到localhost。这个想法是,当我开发多个站点时,我可以将虚拟主机添加到Apache中,称为site1.localsite2.local等等,并使它们全部解析为localhost,而Apache相应地为另一个站点提供服务。

我在Windows XP上。

我尝试添加

127.0.0.1       *.local

到我的c:\windows\system32\drivers\etc\hosts文件,也尝试过:

127.0.0.1       .local

两者似乎都不起作用。

我知道我可以在不同的端口号上设置它们,但是这很麻烦,因为很难记住哪个端口是哪个。

我不想设置本地DNS服务器或其他任何困难,有什么建议吗?


1
请随时使用anysubdomain.reconn.co.uk作为解决方法(如果您在线),该方法始终指向您的本地主机(请参阅下面的答案)。
Paul Grimshaw 2012年

解析apache vhosts ServerName并更新hosts文件的脚本怎么样?
Elvis Ciotti 2013年

1
我相信* .local具有特殊的语义,您应该使用不存在的东西。我使用* .dev,因为我认为这不是真实的。
WraithKenny 2013年

Answers:


431

压克力DNS代理(免费,开源)可以完成这项工作。它使用自己的主机文件创建一个代理DNS服务器(在您自己的计算机上)。hosts文件接受通配符。

从官方网站下载

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

配置丙烯酸DNS代理

要配置Acrylic DNS代理,请从上面的链接安装它,然后转到:

  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代理服务:

  1. 开始
  2. 程式
  3. Acrilic DNS代理
  4. 设定档
  5. 重新启动丙烯酸服务

您还需要在网络接口设置中调整DNS设置:

  1. 开始
  2. 控制面板
  3. 网络与互联网
  4. 网络连接
  5. 本地连接属性
  6. TCP / IPv4

设置“使用以下DNS服务器地址”:

Preferred DNS Server: 127.0.0.1

然后,如果将此答案与jeremyasnyder的答案结合在一起(使用VirtualDocumentRoot),则只需创建目录即可自动设置域/虚拟主机。


12
请注意,“自定义主机文件”是AcrylicHosts.txt,而不是AcrylicConfiguration.ini。也许这应该很明显,但是这让我有些困惑。
mhenry1384

@Petah-这个确切的配置对我使用通配符域有效,但是它只是停止了,我不知道为什么。所有请求都返回“此页面不可用”。重新启动Acryllic,重置所有缓存...您认为还可能是什么?
SB2055 2014年

1
@ SB2055检查网络属性中的DNS设置是否正确。
Petah

应该注意的是,Acrylic不太适合网络环境频繁更改的情况。Google的公共DNS服务器不会解析您网络中的真实计算机名称...您可以为一个网络解决该问题,但是当您转到另一个网络时,仍然无法解析内部计算机名称。这可能会特别痛苦。但我也要指出,我不知道关于丙烯酸的所有知识。
Alex Dresko 2015年

如果在VM中完成此操作,PrimaryServerAddress则应将配置中的(而不是hosts文件)从默认更改8.8.8.8为主机提供的配置。在VirtualBox中,这是10.0.2.3
mayyiam 2015年

80

要回答您的问题,您不能在Windows下的hosts文件中使用通配符。

但是,如果您只想更改hosts文件以使新站点正常工作....,可以像这样配置Apache,而不必继续编辑它的config:

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 /中的页面


您可以在OSX上使用通配符吗?
cjm2671 2011年


30

我认为不可能。

无论如何,每次添加新站点和位置时,您都必须修改apache virtualroot条目,因此将新名称同步到Windows vhost文件并不是一件繁重的工作。

更新:请检查下一个答案和对此答案的评论。这个答案是6岁,不再正确。


3
但是在使用Nginx时,无需更改Nginx的配置文件即可添加一组新的二级域* .localhost。因此,这是主机文件的负号。
sergzach 2012年

8
只是要指出,当您拥有一个多语言网站时,您可能会有一个<VirtualHost>,其中带有ServerAlias *.mydomain.localhost*是语言代码),因此您不必在每次添加新语言时都编辑httpd.conf;但您仍然需要将子域添加到hosts文件中,因此上述问题的相关性。
本杰明·

10
动态虚拟主机是这里的关键字,大多数服务器(例如Apache和Nginx)都支持动态虚拟主机。因此,不,您绝对不必在每次创建项目时都触摸Apache配置。
Valentin Klinghammer

2
我们也可以有通配符虚拟主机,这hosts实际上
取决于

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,它也可以为您的团队成员服务。他们不必使用相同的hosts文件安装本地DNS服务器。
Tobias Uhmann

4

我发现有关使用Windows主机文件的帖子也显示“不允许使用通配符”。

过去,我刚刚将额外的条目添加到hosts文件中,因为(如前所述),当您已经在编辑apache配置文件时,它并没有太多的工作。


制作主机文件的时间越长,解析请求所花费的时间就越长。如果您有很多条目,则不是一个好的解决方案。
cchamberlain

4

当您从Windows命令提示符运行“ ipconfig / flushdns”而不是重新启动计算机时,编辑主机文件就不那么麻烦了。


1
它不会刷新浏览器的dns缓存,而是刷新窗口的。因此,他必须等待20-30分钟,以便浏览器释放dns缓存。
雅各布·梅尔瓦德·詹森

3

您可以说服网络管理员为您设置一个域(例如“ evilpuppetmaster.hell”),并在其中使用通配符,以便所有内容(* .evilpuppetmaster.hell)都解析为您的IP


1
谢谢,但是它在家庭devserver上,没有可用的DNS或网络管理员。
EvilPuppetMaster

好吧,也许您可​​以访问域或知道有人这样做?例如:*。evilpuppetmatser.arealdomain.com
斯图·汤普森

并不是的。即使这样,这也是一台家用计算机,因此每当我的路由器连接到Internet时,它都会获得一个新IP。外部DNS服务器无济于事。
EvilPuppetMaster

1
1)没有理由* .evilpuppetmatser.arealdomain.com无法解析为127.0.0.1,2)我不建议使用外部DNS服务器。我建议您在真实域上使用一个子域。从技术上讲,任何人都可以解析server.evp.arealdomain.com。
Stu Thompson

3
也有一些公开的文件,例如* .127.0.0.1.xip.io和其他文件
Dave James Miller

3

我们在本地DNS服务器中使用通配符DNS来完成这项工作:添加一条A类似于*.local -> 127.0.0.1

我认为您的网络设置将需要在网络上计算机的域后缀搜索列表中具有所选的域后缀,因此您可能需要替换.local为公司的内部域(例如.int),然后添加一个子域.localhost.int以使其清楚是为了什么

因此,*.localhost.int这将解决127.0.0.1网络上的每个人的问题,并且如果端点挂起子域(例如)site1.localhost.intsite2.localhost.int则所有开发人员的配置文件设置将“正常工作” ,这几乎就是我们引入的方案。

dnsmasq看起来也不错,但是我还没有尝试过:http : //ihaveabackup.net/2012/06/28/using-wildcards-in-the-hosts-file/




2

我正在使用DNSChef来做到这一点。

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

您必须下载该应用程序,在Linux或Mac中,您需要python才能运行它。Windows有自己的exe。

您必须使用dns条目创建一个ini文件,例如

[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

或在Windows中

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

最后,您需要将本地主机环境(网络,接口,dns或类似环境或在Linux /etc/resolv.conf中)设置为唯一的DNS。

而已


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"
    }
]

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文件的代码不支持通配符条目。

解决方法是预先创建所有条目,也许使用脚本一次放置几百个条目。


0

@petah和Acrylic DNS代理是最好的答案,最后他提到了使用Apache做多站点的能力,@ jeremyasnyder描述了一点点...

...但是,在我们的案例中,我们正在测试一个多租户托管系统,因此我们要测试的大多数域都位于同一域virtualhost,而其他两个域则指向其他地方。

因此,在本例中,您只需在ServerAlias指令中使用正则表达式通配符,就像这样...

ServerAlias *.foo.local

0

这是尝试实现目标的人员的总体配置(开发环境中的通配符,即XAMPP,此示例假定所有站点都指向相同的代码库)

主机文件(添加条目)

文件:%SystemRoot%\ system32 \ drivers \ etc \ hosts

127.0.0.1   example.local

httpd.conf配置(启用虚拟主机)

档案:\ 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文件:

另存为what.pac,然后在浏览器的网络>代理>自动配置设置中加载文件(如果更改此设置,则重新加载)

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

没用,还不了解PAC,但此行“返回“ PROXY example.local”;“ 不会返回浏览器用作代理的ip:port代理吗?
Ionut

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地址并在DNS查询中返回相同的IP地址来完成此操作。您将必须在要从其访问远程系统的计算机上运行echoipdns。

echoipdns也可以设置为独立的DNS代理,因此,只需指向此DNS,您现在就可以使用上述所有优点,而无需每次都运行特殊命令,甚至可以从移动设备使用它。

因此,从本质上讲,这简化了针对本地以及团队环境的基于通配符域的DNS开发。

echoipdns可在Mac,Linux和Windows上运行。

注意:我是echoipdns的作者。


0

使用Acrylic DNS代理配置nginx config自动子域

您的nginx站点文件夹的auto.conf文件

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主机文件,127.0.0.1 example.com *.example.com然后重新启动Acrylic服务。 $ branch-您的子域名。

设置而不是 根/ 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

-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
...


我认为原始张贴者正试图避免此步骤的麻烦。
西蒙·伊斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.