309

我想设置我的本地开发机器,以便将任何请求*.local重定向到localhost. 这个想法是,当我开发多个站点时,我可以将虚拟主机添加到 Apache等,并让它们全部解析为site1.local,而 Apache 相应地为不同的站点提供服务。site2.locallocalhost

我在 Windows XP 上。

我尝试添加

127.0.0.1       *.local

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

127.0.0.1       .local

两者似乎都不起作用。

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

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

4

20 回答 20

454

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

从官网下载

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

配置 Acrylic 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)结合起来,您可以通过简单地创建一个目录来自动设置域/虚拟主机。

于 2012-03-14T04:17:26.727 回答
81

要回答您的问题,您不能在 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 并将必要的文件放在那里,它就可以工作了。

另一种选择是在 apache.conf 中使用<Directory>标签并引用来自http://localhost/project/的页面。

于 2008-11-07T13:42:16.193 回答
31

我不认为这是可能的。

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

更新:请检查下一个答案以及对此答案的评论。这个答案已有 6 年历史,不再正确。

于 2008-09-26T07:41:53.983 回答
7

为了补充已经在这里的好建议,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 with zero setup

于 2015-03-20T03:37:42.273 回答
6

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

于 2010-10-17T17:43:54.717 回答
5

我发现一篇关于使用 Windows 主机文件的帖子也说“不允许使用通配符”。

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

于 2008-09-27T23:58:24.477 回答
4

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

于 2008-09-26T08:02:56.583 回答
4

我们在本地 DNS 服务器中使用通配符 DNS 进行这项工作:添加A类似的记录*.local -> 127.0.0.1

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

所以*.localhost.int127.0.0.1为网络上的每个人解决,如果端点挂断该子域,所有开发人员的配置文件设置将“正常工作”,例如site1.localhost.intsite2.localhost.int这几乎是我们引入的方案。

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

于 2013-07-23T13:46:18.957 回答
3

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

我已经在 Linux 和 Mac OS X 中进行了测试,但还没有在 Windows 中进行测试。

于 2011-05-02T09:32:31.660 回答
3

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

于 2012-03-05T13:41:42.547 回答
3

我正在使用 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

或在窗口中

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

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

就是这样

于 2014-02-28T14:07:53.057 回答
3

我制作了这个简单的工具来代替主机。支持正则表达式。 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"
    }
]
于 2015-03-04T04:04:29.567 回答
1

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

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

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

ServerAlias *.foo.local
于 2014-01-16T04:50:40.433 回答
1

您可以为此使用 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 的作者。

于 2015-01-09T10:12:45.123 回答
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 文件的代码不支持通配符条目。

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

于 2008-12-05T00:48:06.943 回答
0

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

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

于 2012-06-28T20:21:00.880 回答
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>

重启阿帕奇

创建 pac 文件:

保存为whatever.pac,然后在浏览器的network>proxy>auto_configuration设置中加载文件(如果你改变这个,重新加载)

function FindProxyForURL(url, host) {
  if (shExpMatch(host, "*example.local")) {
    return "PROXY example.local";
  }
  return "DIRECT";
}
于 2014-08-19T19:56:09.700 回答
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 hosts 文件127.0.0.1 example.com *.example.com并重新启动 Acrylic 服务。 $branch - 您的子域名。

设置而不是 根 /var/www/html/$branch/public; 你的项目路径

于 2019-01-29T14:21:51.893 回答
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
于 2019-10-30T09:30:00.463 回答
-1

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

于 2009-04-30T21:03:48.460 回答