【问题标题】:Wildcards in a Windows hosts fileWindows 主机文件中的通配符
【发布时间】:2010-09-13 09:10:34
【问题描述】:

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

我使用的是 Windows XP。

我尝试添加

127.0.0.1       *.local

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

127.0.0.1       .local

这两种方法似乎都不起作用。

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

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

【问题讨论】:

  • 请随意使用 anysubdomain.reconn.co.uk 作为解决方法(如果您在线),它将始终指向您的本地主机(请参阅下面的答案)。
  • 解析 apache vhosts ServerName 并更新 hosts 文件的脚本怎么样?
  • 我相信 *.local 有特殊的语义,你应该使用不存在的东西。我使用 *.dev 因为我不认为这是真的。

标签: windows apache dns hosts virtual-hosts


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    你的 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 - 您的子域名。

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

    【讨论】:

      【解决方案3】:

      为了补充已经在这里的好建议,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 服务器。
      • 嗯... XIP.IO 似乎已于 2021 年 7 月 5 日关闭。也许它不再处于活动状态?
      【解决方案4】:

      我制作了这个简单的工具来代替主机。支持正则表达式。 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"
          }
      ]
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我认为这是不可能的。

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

          更新:请检查下一个答案和此答案的 cmets。这个答案已有 6 年历史,不再正确。

          【讨论】:

          • 但是在使用 Nginx 时,不需要更改 Nginx 的配置文件来添加一组新的二级域 *.localhost。所以,这是主机文件的减号。
          • 只是要指出,当您有一个多语言网站时,您可能有一个带有ServerAlias *.mydomain.localhost* 是语言代码)的 ,这样您就不必编辑 httpd .conf 每次添加新语言时;但是您仍然需要将子域添加到主机文件中,因此上述问题的相关性。
          • 动态虚拟主机是这里的关键字,大多数服务器都支持,例如 Apache 和 Nginx。所以不,您绝对不必每次创建项目时都触摸 Apache 配置。
          • 我们也可以有通配符虚拟主机,真的只有hosts文件
          【解决方案7】:

          这里是那些试图实现目标的总配置(开发环境中的通配符,即 XAMPP -- 本示例假设所有站点都指向相同的代码库)

          hosts 文件(添加条目)

          文件:%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 文件:

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

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

          【讨论】:

          • 没用,还不知道 PAC 但是这一行 'return "PROXY example.local";'不会返回一个代理 ip:port 被浏览器用作代理?
          【解决方案8】:

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

          【讨论】:

          • 明确一点,“自定义主机文件”是 AcrylicHosts.txt,而不是 AcrylicConfiguration.ini。也许这应该是显而易见的,但它让我困惑了一段时间。
          • @Petah - 这个确切的配置对我来说适用于通配符域,但它只是停止了,我不知道为什么。所有请求都返回“此页面不可用”。重新启动 Acryllic,重置所有缓存...你认为它还能是什么?
          • @SB2055 检查您的网络属性中的 DNS 设置是否仍然正确。
          • 需要注意的是,Acrylic 不太适合您的网络环境频繁变化的情况。 Google 的公共 DNS 服务器不会解析您网络中的真实机器名称……您可以为一个网络修复它,但是当您转到另一个网络时,您仍然无法解析内部机器名称。这可能特别痛苦。但我也应该指出,我并不了解关于亚克力的所有知识。
          • 我认为由于 Internet 连接共享 (ICS) 服务,Acrylic 不再适用于较新版本的 Windows 10。 (如果你能让它工作,请告诉我)
          【解决方案9】:

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

          就是这样

          【讨论】:

            【解决方案10】:

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

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

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

            ServerAlias *.foo.local
            

            【讨论】:

              【解决方案11】:

              我们在本地 DNS 服务器中使用通配符 DNS 进行这项工作:添加 A 记录类似*.local -&gt; 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/

              【讨论】:

                【解决方案12】:

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

                127.0.0.1 站点 1.local
                127.0.0.1 site2.local
                127.0.0.1 site3.local
                ...

                【讨论】:

                • 我认为原始发布者是在试图避免这一步的麻烦。
                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    【解决方案15】:

                    当您从 Windows 命令提示符运行“ipconfig /flushdns”而不是重新启动您的计算机时,编辑主机文件会更轻松。

                    【讨论】:

                    • 它不会刷新浏览器 dns 缓存,而是刷新窗口。所以他必须等待 20-30 分钟让浏览器释放 dns 缓存。
                    • 当设置为使用系统代理设置时,Firefox 在执行“ipconfig /flushdns”命令后完全透明(在 2020 年的 Windows 10 上)。
                    【解决方案16】:

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

                    【讨论】:

                    • 这将解析为您的外部 IP,通常只会显示您的路由器/调制解调器配置页面
                    【解决方案17】:

                    我找不到书面禁令,但按照惯例,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 文件的代码不支持通配符条目。

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

                    【讨论】:

                      【解决方案18】:

                      为了回答您的问题,您不能在 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 中使用&lt;Directory&gt; 标签并引用来自http://localhost/project/ 的页面。

                      【讨论】:

                      【解决方案19】:

                      我发现了一篇关于 Using the Windows Hosts File 的帖子,上面还写着“不允许使用通配符”。

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

                      【讨论】:

                      • 制作 hosts 文件的时间越长,解决请求所需的时间就越长。如果您有很多条目,这不是一个好的解决方案。
                      【解决方案20】:

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

                      【讨论】:

                      • 谢谢,但这是在家庭开发服务器上,没有可用的 DNS 或网络管理员。
                      • 好的,也许您可​​以访问某个域或认识某个可以访问的人?例如:*.evilpuppetmatser.arealdomain.com
                      • 并非如此。即便如此,这是一台家用机器,所以每次我的路由器连接到互联网时它都会获得一个新的 IP。外部 DNS 服务器无济于事。
                      • 1) 没有理由 *.evilpuppetmatser.arealdomain.com 无法解析到 127.0.0.1,2) 我不建议使用外部 DNS 服务器。我建议您在真实域上使用子域。从技术上讲,任何人都可以解析 server.evp.arealdomain.com。
                      • 还有一些公开的,比如*.127.0.0.1.xip.io 和others
                      猜你喜欢
                      • 2011-05-10
                      • 2023-04-06
                      • 2010-10-16
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-06-08
                      • 2012-05-06
                      • 2013-11-08
                      • 2014-07-09
                      相关资源
                      最近更新 更多