2013-01-02 77 views
0

我有一个使用主域(domain.com)的应用程序,我希望能够将其他域指向相同的内容,而无需维护单独的代码实例。该应用程序包含在主域中的文件夹,该文件夹不被搜索引擎等访问,所以我不担心搜索引擎优化等。所有的域将在运行Apache的同一台服务器上。使用相同内容的多个域

我想确保域名保持原来的状态,而不是重定向到domain.com,因为这样做的目的是让多个客户可以使用代码,但是使用他们的颜色标记给他们的应用程序,标志等使用来自MySQL数据库的设置。

例如,用户转到newdomain.com,他们看到一个登录表单,它是存储在/ home/newdomain/public_html中的本地登录表单 - 成功登录时,它们被定向到包含应用程序的/文件夹,而不是导向到newdomain.com/folder这是空的我希望他们被重定向到domain.com/folder(即/ home/domain/public_html /文件夹),但仍然在他们的浏览器中看到newdomain.com/folder,因此它是透明的他们。

我试过下面https://stackoverflow.com/a/9521102/1278201使用htaccess,但它改变了URL到domain.com:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule^http://www.domain.com/%{REQUEST_URI} [R=301,L] 

我还发现,使用Apache的配置这似乎是更好的选择,因为我不关心SEO里面提到一个职位但我不知道如果我可以用它来只重定向一个文件夹(即不重定向根目录,只是重定向/文件夹)https://stackoverflow.com/a/3849129/1278201

NameVirtualHost * 

<VirtualHost *> 
ServerName domain.com 
DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 

<VirtualHost *> 
ServerName newdomain.com 
DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 

我还发现帖子指出与会话和SSL证书可能存在的问题https://stackoverflow.com/a/140008/1278201这两个都在应用程序中使用。我很高兴为每个域安装一个单独的SSL证书,但上述任何重定向“中断”会话都可以吗?如果有人登录到newdomain.com/folder,然后转到domain.com/folder,他们需要再次登录,但是将domain.com/folder重定向到newdomain.com/folder的事实会影响会话安全性?

达到预期结果的最佳方法是什么?

+0

这正是['ServerAlias'(http://httpd.apache.org/docs/2.2/mod/core.html#serveralias)指令是什么。 – DaveRandom

回答

0

虚拟主机配置

上面配置片段简单地设置了两个virtualHosts中的Apache。它们中的每一个指向相同的文档根目录 - 这是将成为网站根文件夹的文件夹。没有重定向。虚拟主机是正确的解决方案。

EDIT1 如果你想一般使用相同的文件对所有虚拟主机,但单例外,你可以在每个虚拟主机

例如使用mod_rewritemod_alias重写请求domain.com/favicon.ico可以从document_root/specific/domain.com/favicon.ico

SSL证书

除非你的客户分享使用子域名,你将需要为每个虚拟主机SSL证书的域读取。如果他们刚刚获得子域名,则可以购买一个通配符证书* .yourdomain。COM

问题与几个领域是,你需要为每个虚拟主机一个IP为了使用不同的SSL证书:How can I setup different SSL-Certificates for vhosts on Apache?

会议

您的应用程序将需要检查的域。 Cookie是为特定域设置的,但客户端可以通过操作Cookie将会话“移动”到另一个域。无论如何,我不认为你想要允许所有域上的所有用户,所以需要在证书检查时进行检查。 此外,您可以保存域到会话和终止会话时域变化

session_start(); 
if (user_authorized_with_credentials_and_domain) { 
    $_SESSION['sess_domain'] = $_SERVER['HTTP_HOST']; 
} 

在以后的请求,你可以比较

if ($_SESSION['sess_domain'] !== $_SERVER['HTTP_HOST']) { 
    session_destroy(); 
    // redirect to login 
} 
+0

那么我可以使用“ServerName newdomain.com/folder”还是只能在整个域上使用?即我希望root在本地域和文件夹中显示内容以显示domain.com/folder内容 – bhttoan

+0

呃..您是否介意阅读有关虚拟主机的链接? 'ServerName domain.com'会让所有来自'domain.com'的请求从您指定的文件夹中读取。这可以是像'/'或'/ i/love/cookies.html'这样的请求,如果它存在于你的文件夹中的话。 –

+0

这就是我所怀疑的 - 我需要用户能够查看从本地域提供的newdomain.com/login.php,并且仅当它们被定向到/文件夹时才使用domain.com/folder。如果我正确地阅读链接,那么我不能与vhosts做这件事,因为它是全部或没有,即newdomain.com/login.php实际上会使用domain.com/login.php,这不是我需要的 – bhttoan

2

您可以使用“P”(代表代理通行证)作为标志而不是'R = 301':

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$ [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [P,L] 

还要将虚拟主机更改为单个主机:

NameVirtualHost * 

<VirtualHost *> 
    ServerName domain.com 
    ServerAlias www.domain.com newdomain.com www.newdomain.com 
    DocumentRoot /home/domain/public_html/folder 
</VirtualHost> 
相关问题