2011-12-21 38 views
2

我已经做了一些没有和解决方案的这个问题的研究。多个域来改变共享主机PHP文件的内容

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

我查看了$_SERVER['REMOTE_HOST']$_SERVER['HTTP_REFERRER']后者已被明确声明是不可靠的。我在一个足够强大的解决方案之后。

.htaccess不会做的伎俩(我不会想?)我正在考虑一些沿着域名DNS IP的行列,作为行动的坚实来源。将不胜感激一些指导。

更新:有一些解决方案建议 - 我想有一个SQL表,其中将包含所有预期的域。 TABLE客户端('id_client','client_name','client_url')并查询此表,将'id_client'返回给$变量。

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

$ _SERVER ['HTTP_HOST']失败的情况是什么?

回答

2

你的确可以用的.htaccess

做到这一点随着modrewrite重写domaina.com到index.php?CLIENT_ID =一个

下面的代码示例,从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] 

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

+0

谢谢托尔!是的,我没有想到。然而,我没有提到(抱歉),他们需要隐藏起来。在您的示例中,如果用户要将index.php?client_id = a更改为index.php?client_id = b,他们将查看错误的站点。这不像我想的那样健壮。你或其他人是否可以想出其他方法来实现这个目标? – Tom 2011-12-21 02:42:09

+0

@ user1108993 @Andrew这就是mod_rewrite的魔力!重写是隐藏/内部的。用户看到'domaina.com',但应用程序看到'?domain = a',或者您选择重写它。 – Thor 2011-12-21 02:59:40

0

这可以分两步完成。首先使用在虚拟主机配置每个域的别名,你可以指出它们,这样所有的请求,请访问:

托管文件夹 /controller.php/Domain/requested文件夹/页

一个虚拟主机文件来实现这对于DOMAINA可能看起来像这样:

<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可能是这样的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; 
?> 
+0

谢谢Ravenex!这听起来有希望。一个例子将不胜感激 - 迄今为止,我不太理解你的建议。谢谢你。 – Tom 2011-12-21 02:50:00

+0

我已经添加了一些示例。我们在我们编写的几个Facebook应用程序中使用这种解决方案,允许用户通过单个主控页面访问不同的终端,还可以分离开发和生产环境。唯一的限制是分离内容以避免图像和其他内容通过控制器被引导,但是通过巧妙地使用相同的主体可以避免。 – Ravenex 2011-12-21 03:20:51

+0

这也可用于创建Control-Model-View环境,其中用户将转到/ Control/View并且页面首先加载指定的控件对象以处理所有数据,然后加载该控制器的指定视图。这允许将用于逻辑的代码与用于显示生成的代码方便地分离。 – Ravenex 2011-12-21 03:25:39

1

如果您正在寻找这样做在你的代码最简单的方法是检查$_SERVER['HTTP_HOST']返回该用户使用的是访问您的网站的主机名。例如,如果我访问了http://www.exampleA.com/,那么$_SERVER['HTTP_HOST']将返回www.exampleA.com

然后要执行路由,这是一个简单的情况,即根据已知主机名列表检查主机,并根据使用变量的值指定client_id。

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