如何将子域路由到帐户页面?域名屏蔽如何工作?[关闭]
-
03-07-2019 - |
题
第1部分
我想构建一个用户可以注册使用的 PHP Zend Framework 应用程序。当他们注册时,我希望应用程序创建一个指向其公共页面的子域,该子域提供特定于该客户的内容。
例如: http://mywebapp.com/用户名 或者 http://用户名.mywebapp.com
更新: “使用子域作为帐户密钥” 是一篇很好的教程,几乎回答了我的问题。这涉及到使用 Zend_Controller_Router_Route_Hostname
.
然而,我仍然想知道......
问题#1: 该教程没有提到设置通配符子域。为了实现这一目标,这是必要的吗?有什么办法可以使用通配符子域吗?
第2部分
我还需要为用户提供注册域名并将他们指向其页面的能力。所以如果你要去 http://clientdomain.com, ,你会看到 http://clientname.mywebapp.com, ,但你永远无法分辨,因为地址栏中的网址显示 http://client1.com. 。那有意义吗?我认为这个过程称为域屏蔽。我基本上想为我的用户提供免费的域名屏蔽。
更新: 我刚刚发现了域名经销商 API 的世界。 开放SRS 看起来不错。您有推荐的吗?
问题2: 域名屏蔽如何工作?它可以与域名经销商 API 一起使用吗?
解决方案
对于您问题的第 1 部分,您可以在此处实施任何解决方案 - 但我不确定您是否需要路由器 - 您不会为每个站点提供不同的功能 - 您只想根据 URL 加载不同的内容。我们用一种非常简单的方式来处理这个问题:
- 在 bootstrap.php 中,您需要获取服务器 URL
- 获取 URL 并删除 http:// 之后和 .mywebapp.com 之前的部分
- 在数据库表中查找此前缀,并加载您需要的有关用户的任何信息或与此前缀有关的其他信息
- 将一个对象放入 Zend_Config 中,然后您可以从任何包含站点详细信息的页面(我们称之为 siteinfo)访问该对象。
- 修改您的控制器或视图以根据站点信息做出不同的响应 - 即。更改他们检索的数据等
您需要修改 apache 来处理这个问题 - 最简单的方法是确保您的默认域(无法识别 URL 时出现的页面)设置为您的应用程序。
处理 DNS 更改并不那么容易 - 您需要有一个可以处理通配符回复的 DNS 服务器。
第2部分:我想你是说如果我输入网址 http://grouchal.com 这将重定向到 http://grouchal.yourwebapp.com. 。这需要我更新 grouchal.com 的现有 DNS 服务器条目,以便找到您的服务器。
如果您想在实践中看到一个很好的例子,您应该为您的域帐户设置一个谷歌应用程序。我有像 mail.grouchal.com 这样的网址,一旦输入就会变成 mail.google.com/a/grouchal.com。这需要我设置 grouchal.com DNS 服务器以指向 google 服务器。然后,谷歌服务器会放置一个重定向,将网址更改为他们需要的网址。
回到我上面提出的解决方案,您可以修改它,以便除了检查您的域名何时存在的前缀(即从 http://grouchal.mywebapp.com)它还会查找备用域。因此,如果地址中没有 mywebapp.com,那么它将在数据库 grouchal.com 中查找,然后使用该数据设置 siteinfo。
希望这是有道理的 - 您遇到的问题不会出现在 PHP 中,而是出现在设置您的 Wildcat DNS 服务器并让您的客户正确配置其 DNS 服务器时。不过祝这个项目好运。
其他提示
首先,你是对的。您不希望应用程序的多个实例/安装。 设置多个Apache虚拟主机以指向Doc Root。
ServerName www.serverOne.com
DocumentRoot "/htdocs/myapp/public"
SetEnv CONFIG_ENV "serverOne"
ServerName www.serverTwo.com
DocumentRoot "/htdocs/myapp/public"
SetEnv CONFIG_ENV "serverTwo"
将所有基本网址,路径等放在Zend_Config_Xml文件的不同部分。
<?xml version="1.0" standalone="yes"?>
<config>
<siteOne>
<base_url>http://www.siteOne.com</base_url>
<image_path>/images/siteOne/</image_path>
<database>
<host>34.23.34.457</host>
<name>siteOne_DB</name>
<user>siteOne</user>
<pass>**********</pass>
</database>
</siteOne>
<siteTwo>
<base_url>http://www.siteTwo.com</base_url>
<image_path>/images/siteTwo/</image_path>
<database>
<host>34.23.34.456</host>
<name>siteTwo_DB</name>
<user>siteTwo</user>
<pass>**********</pass>
</database>
</siteTwo>
</config>
然后在你的/public/index.php
中<?php
require '../common/config/Bootstrap.php';
$bootstrap = new Bootstrap($_SERVER['CONFIG_ENV']);
$bootstrap->runApp();
?>
在Bootstrap.php的runApp()方法中:
function runApp($env)
{
$root = realpath(dirname(__FILE__) . '/..');
$config = new Zend_Config_Xml($root . '/config.xml', $env);
这将与相对链接完美配合,并且不需要任何模式匹配:)
如果您没有Bootstrap.php文件,可以学习如何创建<!> amp;在Manning Press的<!>中使用; Zend Framework In Action <!> quot;本书,可立即以PDF格式下载。它帮助我度过了一段艰难时期。
由于Zend Framework使用MVC模式,您可以拥有单个模型和控制器,然后为每个域提供不同的视图。
拥有自定义视图后,您可以检测键入的域并显示正确的视图。例如,在您的引导程序中,您可以通过这种方式检测域:
// Bootstrap or controller
$domain = array_reverse(split('[.]', $_SERVER['SERVER_NAME']));
$domain = $domain[1] . '.' . $domain[0];
// Store domain in registry
Zend_Registry::set('domain', $domain);
// Calling the view from the controller
$domain = Zend_Registry::get('domain');
$this->render($domain . 'home');
这只是一个想法!