【问题标题】:Multiple Domains to vary content on shared host PHP files多个域以改变共享主机 PHP 文件上的内容
【发布时间】:2011-12-21 02:21:34
【问题描述】:

我已经对这个问题进行了一些研究,但还没有解决方案。

设置如下:多个域,例如 www.domainA.com 和 www.domainB.com。 两个域都映射到 LAMP 服务器上的相同托管文件夹。我希望该文件夹中的 index.php 文件“知道”哪个域正在访问这些文件并改变 SQL 的内容。 IE。加载特定于该域的不同客户端 ID。

我研究了$_SERVER['REMOTE_HOST']$_SERVER['HTTP_REFERRER'],后者已被明确表示不可靠。我正在寻求一个足够强大的解决方案。

.htaccess 不会成功(我不这么认为?)我在想一些类似于域 DNS IP 的东西作为行动的可靠来源。非常感谢一些指导。

更新:已经提出了一些解决方案 - 我想要一个包含所有预期域的 SQL 表。 TABLE 客户端('id_client'、'client_name'、'client_url')并查询此表,将 'id_client' 返回到 $variable。

如果 $_SERVER['HTTP_HOST'] 与数据库中的 client_url 匹配,则返回相应的 id_client。 .htaccess 解决方案——无论多么优雅——都需要不断更新文件。我希望尽可能将解决方案保留在 php 和数据库中。

$_SERVER['HTTP_HOST'] 在什么情况下失败?

【问题讨论】:

    标签: php dns


    【解决方案1】:

    您确实可以使用 .htaccess 完成此操作

    使用 modrewrite 将 domaina.com 重写为 index.php?client_id=a

    这是一个代码示例,取自http://corz.org/serv/tricks/htaccess2.php

    #two domains served from one root..
    RewriteCond %{HTTP_HOST} domain-one.com
    RewriteCond %{REQUEST_URI} !^/one
    RewriteRule ^(.*)$ one/$1 [L]
    
    RewriteCond %{HTTP_HOST} domain-two.com
    RewriteCond %{REQUEST_URI} !^two
    RewriteRule ^(.*)$ two/$1 [L]
    

    只需修改正则表达式和路由以适应您的情况。

    【讨论】:

    • 谢谢雷神!是的,我没想到。然而,我没有提到,(对不起)它们需要被相当隐藏。在您的示例中,如果用户将 index.php?client_id=a 更改为 index.php?client_id=b 他们将查看错误的站点。这不像我想要的那么强大。您或其他任何人能想出任何替代方法来实现这一目标吗?
    • @user1108993 @Andrew 这就是 mod_rewrite 的魔力!重写是隐藏的/内部的。用户看到domaina.com,但应用程序看到?domain=a,或者您选择重写它。
    【解决方案2】:

    如果您希望在您的代码中执行此操作,那么最简单的方法是检查$_SERVER['HTTP_HOST'],它会返回用户访问您网站时使用的主机名。例如,如果我访问 http://www.exampleA.com/,那么 $_SERVER['HTTP_HOST'] 将返回 www.exampleA.com

    然后要进行路由,这是一个简单的案例,即根据已知主机名列表检查主机并使用变量根据该列表分配 client_id。

    使用像Zend Framework 这样的框架可能会稍微容易一些,因为它已经使用Zend_Controller_Router_Route_Hostname 内置了这个功能,但你也应该能够相对简单地使用独立的PHP 来实现它。

    【讨论】:

      【解决方案3】:

      这可以分两步完成。首先在每个域的虚拟主机配置中使用别名,您可以将它们指向,以便所有请求都转到:

      托管文件夹/controller.php/Domain/requested folder/page

      为 domainA 完成此操作的 vhosts 文件可能如下所示:

      <VirtualHost *:80>
        ServerName domainA.com
        DirectoryIndex index.html index.htm index.php
        DocumentRoot /var/www/
      
        Alias /pages /var/www/pages/control.php/DomainA
      </VirtualHost>
      

      然后 control.php 将接收所有请求,Apache 将发送变量 $_SERVER['PATH_INFO'] 以及 control.php 之后的所有内容。例如,如果用户访问 www.DomainA.com/folder1/pageC.php,那么 $_SERVER['PATH_INFO'] 将是 '/DomainA/folder1/pageC.php'。请注意,必须将动态页面分离到自己的文件夹中才能使此解决方案正常工作,否则对静态内容的请求将通过 control.php 定向,从而导致问题。如果小心操作,这个目录结构将会对用户不可见。

      对于 php 页面,Control.php 可能看起来像这样:

      <?php
      if (isset($_SERVER['PATH_INFO']))
      {
          $path = explode('/', substr($_SERVER['PATH_INFO'], 1)); //substr removes leading slash
          $domain = array_shift($path);
          $page = implode('/', $path); //Note: you will want to verify that there is a page name and append 'index.php' if there is not.
      }
      
      require_once $page;
      ?>
      

      【讨论】:

      • 感谢 Ravenex!这听起来很有希望。一个例子将不胜感激 - 到目前为止我不太明白你的建议。再次感谢。
      • 我添加了一些示例。我们在我们编写的几个 Facebook 应用程序中使用此解决方案,以允许用户通过单个主控制页面进入不同的端点,也可以将开发和生产环境分开。唯一的限制是内容的隔离以避免图像和其他内容通过控制器进行引导,但通过巧妙地使用相同的原则,它可以避免。
      • 这也可用于创建 Control-Model-View 环境,用户将转到 /Control/View 并且页面首先加载指定的控件对象以处理所有数据,然后加载该控制器的指定视图。这样可以方便地将逻辑代码与显示生成代码分开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2013-07-03
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多