Windows主机文件中的通配符

我想要设置我的本地开发机器,以便对*.local的任何请求都被重定向到localhost。这个想法是,当我开发多个站点时,我可以向Apache添加名为site1.localsite2.local等的vhosts,并让它们都解析为localhost,而Apache则相应地服务于不同的站点。

我用的是Windows XP。

我试着加上

127.0.0.1       *.local

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

127.0.0.1       .local

这两种方法似乎都不管用。

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

我不想设置本地DNS服务器,有什么建议吗?

238061 次浏览

我认为这是不可能的。

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

更新:请查看下一个答案和对这个答案的评论。这个答案是6年前的了,不再正确了。

你可以说服你的网络管理员为你设置一个域名(说'evilpuppetmaster.hell'),并在那里使用通配符,这样所有的东西(*.evilpuppetmaster.hell')都解析到你的IP

我发现了一个关于使用Windows Hosts文件的帖子,它还说“不允许通配符。”

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

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

但是,如果您只想更改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,并将必要的文件放在那里,它就可以工作了。

另一个选项是在apache.conf中使用<Directory>标记,并引用http://localhost/project/中的页面。

我找不到书面禁止,但按照惯例,Windows hosts文件紧跟UNIX hosts文件,不能在该文件中放入通配符主机名引用。

如果你阅读手册页,它说:

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

解决方法是提前创建所有的条目,可能使用一个脚本来一次性放置几百个条目。

您可以使用动态DNS客户端,例如http://www.no-ip.com。然后,用外部DNS服务器CNAME *.mydomain.com改为mydomain.no-ip.com。

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

我用Python写了一个简单的dns代理。它将读取/etc/hosts中的通配符条目看这里:http://code.google.com/p/marlon-tools/source/browse/tools/dnsproxy/dnsproxy.py

我已经在Linux &Mac OS X,但还没有Windows。

你可以尝试AngryHosts,它提供了一种支持通配符和正则表达式的方法。实际上,它是一个主机文件增强和管理软件 更多的功能可以看到@ http://angryhosts.com/features/

丙烯酸DNS代理(免费,开源)的工作。它用自己的hosts文件创建一个代理DNS服务器(在您自己的计算机上)。hosts文件接受通配符。

官方网站下载

< a href = " http://mayakron.altervista.org/support/browse.php?path=Acrylic& name = " > http://mayakron.altervista.org/support/browse.php?path=Acrylic& name =家< / >

配置亚克力DNS代理

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

  1. 开始
  2. 项目
  3. 丙烯酸DNS代理
  4. 配置
  5. 编辑定制主机文件(AcrylicHosts.txt)

在文件末尾添加如下代码:

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

重新启动丙烯酸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),你就可以通过简单地创建一个目录来自动设置域/虚拟主机。

虽然你不能添加这样的通配符,但你可以添加你需要的完整网站列表,至少对于测试来说,这对我来说足够好,在你的hosts文件中,你只需要添加:

< p > 127.0.0.1 site1.local < br > 127.0.0.1 site2.local < br > 127.0.0.1 site3.local < br > …< / p >

我们可以在本地DNS服务器中使用通配符DNS:添加A记录,例如*.local -> 127.0.0.1

我认为你的网络设置需要在网络上机器的域后缀搜索列表中有所选的域后缀,所以你可能想用你公司的内部域(例如.int)替换.local,然后添加一个像.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/ < / p >

@petah和丙烯酸DNS代理是最好的答案,最后他提到了使用Apache做多站点的能力,@jeremyasnyder在下面描述了一点…

... 然而,在我们的例子中,我们正在测试一个多租户托管系统,因此我们希望测试的大多数域指向相同的virtualhost,而其他一些域则指向其他地方。

所以在我们的例子中,你只需在ServerAlias指令中使用正则通配符,就像这样…

ServerAlias *.foo.local

我使用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。

就是这样

下面是那些试图实现目标的人的总配置(开发环境中的通配符,例如XAMPP——这个例子假设所有站点都指向相同的代码库)

Hosts文件(添加一个条目)

司机文件:% SystemRoot % \ system32系统\ \等\主机

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 \ \ 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到任何你想要的地方,然后在浏览器的网络中加载文件proxy>auto_configuration设置(如果你改变了这个,重新加载)

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

你可以为此使用echoipdns (https://github.com/zapty/echoipdns)。

通过运行echoipdns local,所有对.local子域的请求都被重定向到127.0.0.1,因此任何具有xyz. local子域的域。本地etc将解析为127.0.0.1。您可以使用任何其他后缀,也只是用您想要的名称替换local。

Echoipdns甚至更强大,当你想使用你的url从其他机器在网络中,你仍然可以使用它零配置。

例如,如果你的机器ip地址是192.168.1.100,你现在可以使用一个域名xyz.192-168-1-100。本地的,将始终解析为192.168.1.100。这个魔术是由echoipdns通过查看域名的第二部分中的ip地址,并在DNS查询中返回相同的ip地址来完成的。您必须在要访问远程系统的机器上运行echoipdns。

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

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

echoipdns适用于Mac、Linux和Windows。

注:我是echoipdns的作者。

我做了这个简单的工具来代替主机。支持正则表达式。 https://github.com/stackia/DNSAgent < / p >

配置示例:

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

为了补充已经在这里的伟大建议,< >强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。

配置nginx配置自动子域与丙烯酸DNS代理

你的nginx sites文件夹的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;
}
}

添加到丙烯酸主机文件127.0.0.1 example.com *.example.com并重新启动丙烯酸服务。 $branch -你的子域名。

设置而不是根/var/www/html/分支/公共美元;你的项目路径

这可以使用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