我知道之前有过一些线索,但我已经尝试了所有建议(我能找到的),到目前为止我没有任何工作......
考虑到这一点,这是我正在尝试做的事情:
首先,我想允许用户发布页面并为每个页面提供他们选择的子域名(例如:user.mysite.com).从我可以收集到的,最好的方法是使用mod_rewrite和.htaccess将user.mysite.com映射到mysite.com/user - 这是正确的吗?
如果这是正确的,有人可以给我明确的指示如何做到这一点?
另外,我在本地进行所有开发,使用MAMP,所以如果有人能告诉我如何设置我的本地环境以相同的方式工作(我读过这个更难),我将非常感激.老实说,我一直在尝试一切无济于事,因为这是我第一次做这样的事情,我完全迷失了.非常感谢您的帮助!
更新: 其中一些答案非常有用,但对于我想到的系统,不能为每个用户手动添加子域.我真正想问的是如何动态地执行此操作,并将wildcard.mysite.com重定向到mysite.com/wildcard-Tumblr的设置方式就是我想要做的完美示例.再次感谢!
至于如何设置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是使用的内容.然后我可以:
使用URL重写,以便子域成为查询字符串OR的一部分
只需从访问过的URL中读取主机值,然后根据该值执行一些逻辑.
那有意义吗?我有几个站点以这种方式设置:使用DNS主机为域创建通配符,然后只需从URL读取主机或基本域,以根据子域(实际上是用户名)决定要显示的内容)
编辑2:
没有DNS条目就无法做到这一点."在线世界"需要知道name1.domain.com,name2.domain.com,...,nameN.domain.com都会转到您服务器的IP地址.唯一的方法是使用适当的DNS条目.您必须使用DNS主机为您的域添加通配符DNS条目.然后,只需从URL读取子域并在代码中执行适当的操作即可.
如果你正在运行*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进行重定向(以便不直接托管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/* - 但从安全角度来看,这对我来说真是太糟糕了.
最好更明确地为要监听的每个主机名设置虚拟主机配置部分,并将每个主机名的重写规则放在其虚拟主机配置中.(将这种东西放在你的Apache配置中更安全,更快,而不是.htaccess,如果你可以帮助它的话.htaccess会降低性能,因为Apache不断搜索.htaccess文件的文件系统并重新分析它们,以及它不太安全,因为这些可能会被用户搞砸.)
像这样,Apache配置中的vhost配置将是:
NameVirtualHost 127.0.0.1:80 # Your "default" configuration must go firstServerName example.com ServerAlias www.example.com DocumentRoot /www/siteroot # etc. # First subdomain you want to redirectServerName vhost1.example.com RewriteEngine On RewriteRule ^(.*)$ http://example.com/vhost1$1 [R] # Second subdomain you want to redirectServerName vhost2.example.com RewriteEngine On RewriteRule ^(.*)$ http://example.com/vhost2$1 [R]
我意识到我很晚才回答这个问题,但我在本地开发解决方案方面遇到了同样的问题.在另一个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