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

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

评论

属于超级用户吗?

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

在超级用户上:unix.stackexchange.com/questions/3352/…

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

#1 楼

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

评论


太棒了!我一直在寻找一个像这样的简单解决方案(在OSX Mavericks BTW上工作)

–比利·穆恩(Billy Moon)
2013年11月5日在22:07



现在,如果我们只能点安装它:)

–metakermit
2014年3月25日上午11:39

我安装了此软件,完成了所有工作并运行了它,但它不会阻止网站。

–DisplayName
2015年12月13日18:47



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

–法雷
2016年9月8日15:41

#2 楼

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

address=/localhost.com/127.0.0.1


评论


辉煌!对于Mac用户请注意,它确实很简单:1. sudo端口安装dnsmasq 2.编辑/opt/local/etc/dnsmasq.conf 3. sudo端口加载dnsmasq

–tomc
11年11月16日在11:57

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

–马特·汉弗莱(Matt Humphrey)
13年3月7日在21:41

fyi brew> port(re @MattHumphrey建议)

– Electricblake
13年3月22日在2:57

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

–布赖恩
13-10-27在19:55

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

–user38397
15年5月21日在18:48

#3 楼

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

#4 楼

您需要设置一个DNS服务器,并让每个客户端使用它进行解析。服务器本身可以像dnsmasq一样“轻”,也可以像BIND一样重。

评论


dnsmasq的+1,它确实有据可查,易于使用

–David Schmitt
2011年5月2日,12:24

dnsmasq无法执行此操作。

–DisplayName
15年12月13日在18:51

dnsmasq.conf手册页的--address =部分中描述的行为的哪一部分没有涵盖上述用例?

–通用梳子
15年12月14日在16:33

#5 楼

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

我个人喜欢为此创建一个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步:尽情享受:)

评论


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

–威廉·范·昂森(Willem Van Onsem)
18年4月24日在21:02

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

–汤姆·布特尔(Tom Boutell)
19年1月2日在20:26

#6 楼

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

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

要求:


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

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


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


#7 楼

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

这里有一个很好的演练,介绍了如何使用内置但未激活的DNS服务器BIND和Apache在OS X上完成操作。

评论


Apache与子域无关。

–匿名
10 Mar 2 '10 at 17:55

#8 楼

在我的情况下,此基于DNS的解决方案运行完美,无需安装任何东西:https://gist.github.com/fedir/04e60d679d5657d1f9f9aa10b3168282(Mac OSX 10.9)

评论


Mac OSX如此出色的解决方案。

– iDev247
2012年9月6日下午7:25

无效链接,请更新您的链接,解决方案,或以某种方式弃用此答案。干杯。

–埃里克·霍登斯基(Eric Hodonsky)
17年5月12日在17:07

完成(已添加备份)

– Fedir RYKHTIK
17年5月18日在12:50

#9 楼

如果要与dnsmasq一起使用NetworkManager,则可以(甚至必须?)通过将
dns=dnsmasq

添加到dnsmasq中来从NetworkManager启动/etc/NetworkManager/NetworkManager.conf。然后dnsmasq配置进入/etc/NetworkManager/dnsmasq.conf/etc/NetworkManager/dnsmasq.d/响应。

#10 楼

简短的答案:

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

评论


什么让您指定端口号?不是DNS AFAIK。

–ptman
10 Mar 3 '10在11:45

#11 楼

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

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

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

#12 楼

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

#!/usr/bin/python

import os

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

lines = hostsFile.readlines()

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

    entryExists = False
    for line in lines:
        if fileName in line:
            entryExists = True  

    if not entryExists:
        hostsFile.write("127.0.0.1 " + fileName + ".localhost\n");


#13 楼

谢谢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";
}


#14 楼

dnsmasq为我工作,除了我不得不执行一些其他步骤。
这是完整的过程:


用以下行添加/etc/resolv.conf
 nameserver 127.0.0.1



将以下行添加到/etc/dnsmasq.conf
 listen-address=127.0.0.1
 address=/localhost.localdomain/127.0.0.1
 address=/localhost/127.0.0.1



重新启动dnsmasq(不要简单地告诉dnsmasq重新加载配置文件)



评论


如果您的发行版使用netplan,则此功能将无效(ubuntu 18.04我在看着您)

– MrMesees
19年2月26日在5:15

真伤心刚刚发现netplan于2016年7月首次发布。我确信他们的做法是“更好”的。

– jbangerter
8月25日0:44

#15 楼

从此博客复制此处是在Mac上的操作方法:
https://hedichaibi.com/how-to-setup-wildcard-dev-domains-with-dnsmasq-on-a-mac/
~ brew install dnsmasq

~ vim /usr/local/etc/dnsmasq.conf

# This file will be added to the configuration
conf-file=/Users/your_user_name/.dnsmasq/dnsmasq.conf

~ vim /Users/your_user_name/.dnsmasq/dnsmasq.conf

# example.localhost will be resolved as 127.0.0.1, including subdomains
address=/example.localhost/127.0.0.1
listen-address=127.0.0.1

~ sudo brew services stop dnsmasq

~ sudo brew services start dnsmasq


我们需要告诉macOS使用127.0.0.1作为第一个DNS解析器。