在我/ Linux / OSX上的/ etc / hosts /文件中,如何做通配符子域?

我需要testing我的本地主机上的子域。 如何有效地将*.localhost.com添加到我的/etc/hosts/文件中?

如果不可能,我该如何解决这个问题? 我需要在本地服务器上testing通配符子域。 它是一个Django devserver,Django dev服务器可以处理子域吗? 其他一些软件/路由可以给我最终的结果吗?

我用Python编写了一个dns代理。 它将读取/ etc / hosts中的通配符条目。 看到这里: https : //github.com/hubdotcom/marlon-tools/blob/master/tools/dnsproxy/dnsproxy.py

安装dnsmasq (我在我所有的Linux桌面上以DNScaching的方式执行此操作)。 在dnsmasq.conf添加一行:

 address=/localhost.com/127.0.0.1 

无法在/etc/hosts文件中指定通配符。 请明确指定所需的主机名,或者使用适当的规则设置本地名称服务器。

您需要build立一个DNS服务器,并让每个客户端使用它来解决。 服务器本身可以像dnsmasq那样“轻”,或者像BIND一样重。

简单的工作stream程(无需安装任何东西)

我个人喜欢创build一个PAC文件,使我的浏览器只使用它。

第1步:创build一个文件,例如: *.proxy.pac*某处(我使用我的$home文件夹)

第二步:粘贴这个代码(例子是8000端口):

 function FindProxyForURL(url, host) { if (shExpMatch(host, "*localhost")) { return "PROXY localhost:8000"; } return "DIRECT"; } 

步骤3 :让浏览器使用这个PAC文件。

Youtube Video for PAC&Firefox

第4步 :现在您可以通过访问来testing您的应用程序: http://mysubdomain.localhost/

第5步:享受:)

你不能在/etc/hosts使用通配符。

在这里看看如何在OS X上使用BIND,内置但不活动的DNS服务器和Apache完成一个很好的演练。

我整理了一个我的旧项目:

https://github.com/airtonix/avahi-aliases

要求:

  • linux可以安装avahi和python-avahi
  • 您可以使用.local域名(avahi不支持任何其他types)

使用dnsmasq或python dns代理的优点:

  • 本地networking上的其他avahi / bonjour用户可以parsing您创build并通告给networking的别名(假设您允许访问端口5353)

这个基于DNS的解决scheme在我的情况下完美工作,无需安装任何东西: https : //gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282 (Mac OSX 10.9)

简短的答案是你没有。 更长的答案是你需要更清楚你想要实现的目标,因为或许有更好的方法,还有一个不同的方法来实现它。

对于networking托pipe(我从来没有见过使用其他方式)是在DNS中结合虚拟主机感知的Web服务器。 有关通配DNSlogging (维基百科)的更多信息,以及使用bind和Apache 进行Apache和Bind for Linux的Wildcard托pipe的文章。

最糟糕的是,你可以使用本地的DNS服务器。

如果你想在NetworkManager使用dnsmasq ,你可以(甚至必须)通过添加NetworkManager来启动dnsmasq

 dns=dnsmasq 

/etc/NetworkManager/NetworkManager.conf 。 然后dnsmasqconfiguration进入/etc/NetworkManager/dnsmasq.conf/etc/NetworkManager/dnsmasq.d/ resp。

此主题的一个常见任务是将目录映射到子域。 一个非常直接的方法是将基于目录的条目自动附加到hosts文件中:

  #!的/ usr / bin中/python

import操作系统

 hostsFile = open(“/ etc / hosts”,“a +”);

 lines = hostsFile.readlines()

 for os.listdir('/ opt / subdomainDirs')中的fileName:

     entryExists = False
    对于行:
        如果文件名在行:
             entryExists = True  

    如果不是entryExists:
         hostsFile.write(“127.0.0.1”+ fileName +“.localhost \ n”);

感谢tschundeee对于我认为是这个问题的最终答案,希望我可以评论,但这里是完成原始目标的所有configuration(通配符都指向相同的代码库 – 安装任何东西,开发环境即,XAMPP)

hosts文件(添加一个条目)

文件:/ etc / hosts(非Windows)

 127.0.0.1 example.local 

httpd.confconfiguration(启用虚拟主机)

文件:/XAMPP/etc/httpd.conf

 # Virtual hosts Include etc/extra/httpd-vhosts.conf 

httpd-vhosts.confconfiguration

文件:XAMPP / etc / extra / httpd-vhosts.conf

 <VirtualHost *:80> ServerAdmin [email protected] 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

创buildpac文件:

保存为whatever.pac无论你想要的,然后加载浏览器的networking>代理>自动configuration设置(重新加载,如果你改变这个)

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

dnsmasq为我工作,除了我不得不采取一些额外的步骤。

这是完整的程序:

  1. /etc/resolv.conf添加以下行

     nameserver 127.0.0.1 
  2. /etc/dnsmasq.conf添加到/etc/dnsmasq.conf

     listen-address=127.0.0.1 address=/localhost.localdomain/127.0.0.1 address=/localhost/127.0.0.1 
  3. 重新启动dnsmasq

简短的回答:

你的/ etc / hosts /文件不会让你使用通配符或端口号。 您将需要为每个子域创build一个条目