我知道之前有过一些线索,但我已经尝试了所有建议(我能找到的),到目前为止我没有任何工作......

考虑到这一点,这是我正在尝试做的事情:

首先,我想允许用户发布页面并为每个页面提供他们选择的子域名(例如:user.mysite.com)。 从我可以收集到的,最好的方法是使用mod_rewrite和.htaccess将user.mysite.com映射到mysite.com/user - 这是正确的吗?

如果这是正确的,有人可以给我明确的指示如何做到这一点?

另外,我在本地进行所有开发,使用MAMP,所以如果有人能告诉我如何设置我的本地环境以相同的方式工作(我读过这个更难),我将非常感激。 老实说,我一直在尝试一切都无济于事,因为这是我第一次做这样的事情,我完全迷失了。 非常感谢您的帮助!

更新: 其中一些答案非常有用,但对于我想到的系统,不能为每个用户手动添加子域。 我真正想问的是如何动态执行此操作,并将wildcard.mysite.com重定向到mysite.com/wildcard-Tumblr的设置方式就是我想要做的完美示例。 再次感谢!

===============>>#1 票数:16 已采纳

至于如何设置DNS子域通配符,这将是您的DNS托管提供商的功能。 这将是不同的步骤,取决于您拥有哪个托管服务提供商,对他们来说将是一个更好的问题。

一旦你使用DNS主机进行了设置,从你的网络应用程序中你实际上只是URL重写,可以通过某种模块为Web服务器本身完成,例如isapi重写,如果你在IIS上(这如果可能的话,将是首选路线)。 您也可以在应用程序级别处理重写(如在ASP.NET上使用路由)。

你重写了这个URL,所以http://myname.domain.com会成为http://domain.com/something.aspx?name=myname之类的东西。 从那里开始,你只需处理它,就好像myname值在查询字符串中一样正常。 那有意义吗? 希望我没有误解你所追求的是什么。

编辑:

我并不是建议您为每个用户创建子域,而是为域本身创建一个通配符子域,因此任何 .domain.com(基本上是* .domain.com)都会转到您的站点。 我有几个域使用mydomain设置。 他们设置这个的说明是这样的:

是的,您可以配置通配符,但只有在将其设置为A记录时才能使用。 通配符不适用于C名称。 要使用通配符,请使用星号字符'*'。 例如,如果使用通配符.domain.com创建和记录,则在“所在位置”输入的任何内容都将解析为指定的IP地址。 因此,如果您在域名前输入“www”,“ftp”,“site”或其他任何内容,它将始终解析为IP地址

我有一些以这种方式设置,让* .domain.com进入我的网站。 然后,我可以在我的网络应用程序中读取基本URL,以查看ryan.domain.com是当前访问的内容,或者bill.domain.com是使用的内容。 然后我可以:

  1. 使用URL重写,以便子域成为查询字符串OR的一部分
  2. 只需从访问过的URL中读取主机值,然后根据该值执行一些逻辑。

那有意义吗? 我有几个站点以这种方式设置:使用DNS主机为域创建通配符,然后只需从URL读取主机或基本域,以根据子域(实际上是用户名)决定要显示的内容)

编辑2:

没有DNS条目就无法做到这一点。 “在线世界”需要知道name1.domain.com,name2.domain.com,...,nameN.domain.com都会转到您服务器的IP地址。 唯一的方法是使用适当的DNS条目。 您必须使用DNS主机为您的域添加通配符DNS条目。 然后,只需从URL读取子域并在代码中执行适当的操作即可。

===============>>#2 票数:13

如果你正在运行* AMP,最好的办法就是做Thomas建议并在Apache中做虚拟主机。 您可以使用或不使用您描述的重定向来执行此操作。

虚拟主机

很可能你会想要做基于名称的虚拟主机 ,因为它最容易设置,只需要一个IP地址(因此也很容易在本地MAMP机器上设置和测试)。 基于IP的虚拟主机在其他方面更好,但您必须拥有每个域的IP地址。

这个维基百科页面讨论了如何在底部进行基于名称的虚拟主机的基本步骤的差异和链接。

在本地计算机上进行测试,您还必须在/ etc / hosts中为假测试域名设置虚假DNS名称。 即如果你有Apache侦听localhost并在Apache配置中设置vhost1.test.domain和vhost2.test.domain,你只需将这些域添加到/ etc / hosts中的127.0.0.1行,在localhost之后:

127.0.0.1 localhost vhost1.test.domain vhost2.test.domain

完成/ etc / hosts编辑并将基于名称的虚拟主机配置添加到Apache配置文件后,就可以了,重新启动Apache,测试域应该可以运行。

使用mod_rewrite重定向

如果您想使用mod_rewrite进行重定向(以便不直接托管user.example.com而是重定向到example.com/user),那么您还需要执行RewriteCond以匹配子域并重定向它:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com
RewriteRule ^(.*)$ http://example.com/subdomain$1 [R]

您可以将它放在.htaccess或主Apache配置中。

您需要为要重定向的每个子域添加一对规则,例如最后两个规则。 或者,您可以在RewriteCond中捕获子域,以便能够使用一个通配符规则将* .example.com重定向到example.com/ * - 但从安全角度来看,这对我来说真是太糟糕了。

一起,vhosts和重定向

最好更明确地为要监听的每个主机名设置虚拟主机配置部分,并将每个主机名的重写规则放在其虚拟主机配置中。 (将这种东西放在你的Apache配置中更安全,更快,而不是.htaccess,如果你可以帮助它。 - .htaccess会降低性能,因为Apache不断搜索.htaccess文件的文件系统并重新分析它们,以及它不太安全,因为这些可能会被用户搞砸。)

像这样,Apache配置中的vhost配置将是:

NameVirtualHost 127.0.0.1:80

# Your "default" configuration must go first
<VirtualHost 127.0.0.1:80>
  ServerName example.com
  ServerAlias www.example.com
  DocumentRoot /www/siteroot
  # etc.
</VirtualHost>

# First subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost1.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost1$1 [R]
</VirtualHost>

# Second subdomain you want to redirect
<VirtualHost 127.0.0.1:80>
  ServerName vhost2.example.com
  RewriteEngine On
  RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
</VirtualHost>

===============>>#3 票数:7

我意识到我很晚才回答这个问题,但我在本地开发解决方案方面遇到了同样的问题。 另一个SO线程中,我找到了更好的解决方案,并认为我将在未来为同一个问题的任何人分享它们:

VMware拥有的通配符域将任何子域解析为127.0.0.1:

vcap.me resolves to 127.0.0.1
www.vcap.me resolves to 127.0.0.1

或者更多功能37信号拥有一个域,使用特定格式将任何子域映射到任何给定的IP:

127.0.0.1.xip.io resolves to 127.0.0.1
www.127.0.0.1.xip.io resolves to 127.0.0.1
db.192.168.0.1.xip.io resolves to 192.168.0.1

有关更多信息,请参阅xip.io

===============>>#4 票数:4

我在Ubuntu 16.04和14.04,因为我已经使用由戴维·埃文斯提供的解决方案在这里 ,它为我工作得很好。

  1. 安装dnsmasq

     sudo apt-get install dnsmasq 
  2. 使用以下行在/etc/dnsmasq.d目录下创建新文件localhost.conf

     #file /etc/dnsmasq.d/localhost.conf address=/localhost/127.0.0.1 
  3. 编辑/etc/dhcp/dhclient.conf并添加以下行

     prepend domain-name-servers 127.0.0.1; 

    (您可能会发现此行已存在,您只需要取消注释即可。)

  4. 最后一个是重启服务

     sudo systemctl restart dnsmasq sudo dhclient 

最后,你应该检查一下它是否正常工作。

dig whatever.localhost

注意:

如果要在Web服务器上使用它,只需将127.0.0.0更改为实际的IP地址即可。

===============>>#5 票数:1

我必须为我的一个网站做同样的事情。 您可以按照以下步骤操作

  1. 如果您的服务器上有cPanel,请创建子域* ,否则,您必须在DNS中设置A记录(对于BIND,请参阅http://ma.tt/2003/10/wildcard-dns - 和 - 子域/ )。 在你的开发。 通过将每个子域添加到hosts文件,您可以更好地伪造子域。

  2. (如果您使用了cPanel,则不必这样做)。 你必须在你的apache vhosts文件中添加如下内容。 它在很大程度上取决于您运行的服务器类型(共享或不共享)。 以下代码不完整。 它只是提供方向。 注意: ServerAlias example.com *.example.com很重要。

     <VirtualHost 127.0.0.1:80> DocumentRoot /var/www/ ServerName example.com ServerAlias example.com *.example.com </VirtualHost> 
  3. 接下来,因为您可以使用PHP脚本检查“主机”标头并找出子域并相应地提供内容。

===============>>#6 票数:0

我找到的Ubuntu 18.04解决方案与类似,但涉及NetworkManager配置:

  1. 编辑文件/etc/NetworkManager/NetworkManager.conf ,并将行dns=dnsmasq添加到[main]部分

     sudo editor /etc/NetworkManager/NetworkManager.conf 

    应该是这样的:

     [main] plugins=ifupdown,keyfile dns=dnsmasq ... 
  2. 开始使用NetworkManager的resolv.conf

     sudo rm /etc/resolv.conf sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf 
  3. 使用通配符配置创建文件

     echo 'address=/.localhost/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/localhost-wildcard.conf 
  4. 重新加载NetworkManager配置

     sudo systemctl reload NetworkManager 
  5. 测试一下

     dig localdomain.localhost 

您还可以添加任何其他域,在使用本地开发设置时对某些类型的身份验证非常有用。

echo 'address=/.local-dev.workdomain.com/127.0.0.1' | sudo tee /etc/NetworkManager/dnsmasq.d/workdomain-wildcard.conf

然后这工作:

dig petproject.local-dev.workdomain.com

;; ANSWER SECTION:
petproject.local-dev.workdomain.com. 0 IN   A   127.0.0.1

===============>>#7 票数:0

首先,我想允许用户发布页面并为每个页面提供他们选择的子域名(例如:user.mysite.com)。 从我可以收集到的,最好的方法是使用mod_rewrite和.htaccess将user.mysite.com映射到mysite.com/user - 这是正确的吗?

您可能最好使用虚拟主机 这样,每个用户都可以拥有几乎独立于其他用户的Web服务器配置。

语法如下:

<VirtualHost *:80>
    DocumentRoot /var/www/user
    ServerName user.mysite.com
    ...
</VirtualHost>

===============>>#8 票数:0

从我在许多webhost上看到的,他们在apache上设置了一个虚拟主机。

因此,如果您的www.mysite.com是从/ var / www提供的,则可以为每个用户创建一个文件夹。 然后将虚拟主机映射到该文件夹​​。

有了它,mysite.com/user和user.mysite.com都有效。

至于你的测试环境,如果你在Windows上,我建议编辑你的HOSTS文件,将mysite.com映射到你的本地PC(127.0.0.1),以及你设置用于测试的任何子域。

  ask by beaudeal translate from so

未解决问题?本站智能推荐:

2回复

无法找出此通配符子域的不幸事故

我已经尝试了几个小时了,由于某种原因,它不想工作。 我只需要username.domain.com内部访问domain.com/users/username 我设置了我的dns,通配符子域指向public_html / wild文件夹,然后在其中放置了index.html文件,并且一
1回复

如果所有子域都指向网站根目录,则必须使用通配符SSL证书

我是SSL证书的新手,很快就需要购买。 当子域发挥作用时,似乎价格会大幅上涨。 我的问题是: 我设置了我的站点,以便通过htaccess将username.domain.com重写为domain.com?user=username 如果我的网站设置为所有子域都是虚拟的并且指向
1回复

域级别的Apache通配符[关闭]

我有几个站点,并且它们在单个服务器上都具有相同的设置。 现在,我想拥有一个公共文件,而不是在启用站点的目录中为每个配置文件提供单独的配置文件。 想法是这样的: www.abc.com应该有/ var / www / abc作为DocumentRoot,www.xyz.com应该有/
4回复

在本地主机上设置通配符域(OS X 10.5)?

我开始开发一个基本上充当WordPress MU的网站,用户可以注册并拥有自己的博客。 我将在Rails中对此进行编码,但我希望能够使用通配符子域,因此我可以使用blog.example.com等格式。 我做了一些搜索,但我找不到任何好的资源。 由于我使用Rails,我不知道在哪里放这
2回复

通配符应该属于CNAME还是A NAME?

通配符应该属于CNAME还是A NAME? 两者在我看来都是一样的,并且使用Google搜索可以得出不确定的结果。 选择另一种选择背后有什么理性和启示? (基础DNS服务器软件?虚拟主机软件?速度?)
1回复

本地主机上使用codeigniter的通配符子域

我已经通过使用codeigniter在本地主机上设置了虚拟主机,并且工作正常。 但是我无法创建通配符子域。 要添加虚拟主机,以下是我在Windows计算机上执行的步骤。 在这个host.txt文件中,我在下面添加了代码 我正在使用xampp。我在httpd-vhosts.co
17回复

公共通配符域名要解析为127.0.0.1 [关闭]

是否有人知道解析为IP地址127.0.0.1的公共通配符域名。 例如,如果我想在本地测试URL,例如mywebsite.localhost.com或example.localhost.com,但我无法控制DNS设置(主机文件或其他),那么我将使用此公共DNS解析为127.0 .0.1。 它需
1回复

使用htaccess的通配符子域

我在使下面的代码语句按预期工作时遇到麻烦。 代码的第一部分都很好。 当用户点击不带“ www”的example.com时,他会被重定向到www.example.com 301以保护进入的链接。 同时,我正在尝试使用子域。 如果用户点击candybar.example.com,则希望加
3回复

通配符DNS和虚拟子域?

我就是不明白。 我正计划获得这样的方案:username.mydomain.com = mydomain.com/user.php?user=username 好吧,让我们不走那么远,因为此通配符DNS使我发疯了! :/ 我有DNS记录 我的vhost文件中有
1回复

绑定IIS通配符子域

我需要在IIS 7.5上添加“站点映射”,以接受满足某些通配符的域,例如:我需要将某些网站映射到子域: * .aaa.bbbb.com 这意味着:everything.aaa.bbbb.com等。