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


168

我需要在本地主机上测试子域。如何有效地将这种结果添加*.localhost.com到我的/etc/hosts/文件中?

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


1
属于超级用户?
Paul R

我知道有人说不可能!但是我该怎么办!我可以使用/ etc / hosts /以外的东西来获得效果。我正在测试开发服务器。
MikeN


由于大多数答案都集中在您的第一个问题(localhost子域通配符)上,因此我将以评论的形式回答您的第二个问题:是的,Django开发服务器完全能够处理localhost子域,您只需说服浏览器和操作系统即可以自己的方式发送流量(使用以下各种解决方案之一)!
hheimbuerger

Answers:


43

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


太棒了!我长期以来一直在寻找这样的简单解决方案(在OSX Mavericks BTW上工作)
Billy Moon

2
现在,如果我们只能pip install做到这一点:)
metakermit

1
我安装了此程序,执行了所有操作并运行了它,但它不会阻止站点。
DisplayName

无法对此进行足够的投票。我永远都需要它,偶然发现了这个问题和答案的宝藏,而我有点像Python黑客,这真是个奇趣。感谢分享!
Farley

152

安装dnsmasq(无论如何,我都会在所有Linux桌面上都将它作为DNS缓存来执行)。在dnsmasq.conf添加行:

address=/localhost.com/127.0.0.1

7
辉煌!对于Mac用户来说,这确实很简单:1. sudo port install dnsmasq2.编辑/opt/local/etc/dnsmasq.conf3.sudo port load dnsmasq
tomc 2011年

17
带有brew的OSX:与上述相同,但是brew安装dnsmasq
Matt Humphrey

1
FYI酿造>端口(重新@MattHumphrey建议)
electblake

1
这个示例对我不起作用,可能是因为我正在使用vagrantup.com进行本地服务。不用担心,我已经将IP更改为正确的IP,192.168.50.11但是DNS无法解析。任何想法,此示例是否适用于“非127.0.0.1” IP?
布莱恩

6
大提示。对于Ubuntu 14.04桌面(默认情况下运行dnsmasq),创建一个名为的文件/etc/NetworkManager/dnsmasq.d/dnsmasq-localhost.conf并将其放入address=/localhost.com/127.0.0.1其中,然后重新启动。
user38397

60

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



11

简单的工作流程(无需安装任何程序)

我个人喜欢为此创建一个PAC文件,并使我的浏览器使用它。

步骤1:建立档案,例如:*.proxy.pac*某处(我使用我的资料$home夹)

步骤2:粘贴以下代码(示例使用端口8000):

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

步骤3:让您的浏览器使用此PAC文件。

PAC和Firefox的YouTube视频

步骤4:现在,您可以通过访问以下内容来测试您的应用程序:http://mysubdomain.localhost/

步骤5:尽情享受:)


3
也许值得一提的是,这只会影响您的浏览器。其他程序(例如wget,不会受到此影响)。这本身不是问题,但是也许最好提一下。
Willem Van Onsem

如果您使用.pac路由,并且正在实现node.js服务器,您会惊讶地发现它req.url现在是绝对URL。这样做是因为假设您要编写一个实际的代理服务器,但是如果您使用此技术只是为了停止添加/ etc / hosts条目以进行调试,那么这是令人惊讶的。仅供参考,以便那些可能走与我一样的人。
Tom Boutell

5

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

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

要求:

  • 可安装avahi和python-avahi的Linux
  • 您可以使用.local域(avahi不支持任何其他类型)

与使用dnsmasq或python dns代理相比的优势:

  • 本地网络上的其他avahi / bonjour用户可以解析您创建的别名并向网络宣布(前提是您允许访问端口5353)


3

您不能在中使用通配符/etc/hosts

看看这里的有关如何使用BIND,内置的,但不活跃DNS服务器和Apache在OS X上实现良好的演练。


5
Apache与子域无关。
匿名

3

如果要使用dnsmasqNetworkManager可以(甚至必须?)dnsmasqNetworkManager添加开始

dns=dnsmasq

/etc/NetworkManager/NetworkManager.conf。然后,dnsmasq配置进入/etc/NetworkManager/dnsmasq.conf/etc/NetworkManager/dnsmasq.d/响应。



2

简短的答案是你不知道。更长的答案是,您需要更清楚地了解实际想要实现的目标,因为也许有更好的方法,但是有另一种方法可以实现它。

对于网络托管(我从未见过使用过),是在DNS中结合虚拟主机感知的Web服务器完成的。有关通配符DNS记录的更多信息(Wikipedia),以及有关使用Apache和Bind for Linux使用bind和Apache进行通配符托管的文章。

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


2

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

#!/ usr / bin / python

导入操作系统

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

行数= hostsFile.readlines()

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

    entryExists = False
    对于行中的行:
        如果fileName行:
            entryExists =真  

    如果没有,则存在:
        hostsFile.write(“ 127.0.0.1” + fileName +“ .localhost \ n”);

2

谢谢tschundeee,我认为这是该问题的最终答案,希望我能发表评论,但这是那些试图实现原始目标的人员的完整配置(通配符都指向相同的代码库-无需安装,开发环境即,XAMPP)

主机文件(添加条目)

文件:/ etc / hosts(非Windows)

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

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

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

2

dnsmasq为我工作,除了我必须执行一些其他步骤。

这是完整的过程:

  1. 前置/etc/resolv.conf与下面的行

    nameserver 127.0.0.1
    
  2. 将以下行添加到 /etc/dnsmasq.conf

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


如果您的发行版使用netplan(ubuntu 18.04,我在看着您),这将无法正常工作
MrMesees
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.