使用相同内容的多个域

时间:2013-01-02 11:32:44

标签: php apache .htaccess

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

我想确保域名保留为用户最初输入的域名,而不是重定向到domain.com,因为这样的目的是让多个客户可以使用代码,但应用程序使用他们的颜色标记给他们,徽标等使用从MySQL数据库中获取的设置。

例如,用户访问newdomain.com并且他们看到登录表单是本地存储在/ home / newdomain / public_html中 - 成功登录后,他们将被定向到包含应用程序但未被定向的/文件夹到newdomain.com/folder这是空的我希望他们被重定向到domain.com/folder(即/ home / domain / public_html /文件夹),但仍然可以在他们的浏览器中看到newdomain.com/folder,这样它们对他们来说是透明的

我使用htaccess尝试了以下https://stackoverflow.com/a/9521102/1278201,但它将网址更改为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,但我不确定我是否可以使用它只重定向一个文件夹(即不重定向webroot,只是重定向/文件夹)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会对会话安全产生影响?

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

2 个答案:

答案 0 :(得分:2)

你可以使用'P'(代表proxypass)作为标志而不是'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>

答案 1 :(得分:0)

vhost配置

上面的配置代码段只是在Apache中设置了两个virtualHosts。它们中的每一个都指向同一个documentRoot - 这是将成为网站根文件夹的文件夹。没有重定向到位。 Vhosts是正确的解决方案。

<强> EDIT1 如果您希望对所有vhost使用相同的文件,但只有一个例外,您可以在每个vhost中使用mod_rewritemod_alias重写请求

e.g。可以从domain.com/favicon.ico

中读取document_root/specific/domain.com/favicon.ico

SSL证书

除非您的客户使用子域共享域,否则您需要为每个vhost提供SSL证书。如果他们只是获得子域名,您可以购买一个通配符证书* .yourdomain.com

多个域的问题是,每个vhost需要一个IP才能使用不同的SSL证书:How can I setup different SSL-Certificates for vhosts on Apache?

<强>会话

您的申请需要检查域名。为特定域设置cookie,但客户端可以“移动”#34;通过操纵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
}