0

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

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

例如,用户访问 newdomain.com,他们会看到一个登录表单,该表单是存储在 /home/newdomain/public_html 中的本地登录表单 - 成功登录后,他们将被定向到包含应用程序的 /folder,而不是被定向到 newdomain。 com/folder 是空的 我希望他们被重定向到 domain.com/folder(即 /home/domain/public_html/folder),但仍然在他们的浏览器中看到 newdomain.com/folder,所以它对他们是透明的。

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

实现预期结果的最佳方法是什么?

4

2 回答 2

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>
于 2013-01-02T13:39:19.087 回答
0

虚拟主机配置

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

EDIT1 如果您想对所有虚拟主机使用相同的文件,但有一个例外,您可以在每个虚拟主机中使用mod_rewritemod_alias重写请求

例如domain.com/favicon.ico可以从document_root/specific/domain.com/favicon.ico

SSL 证书

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

多个域的问题是,每个虚拟主机需要一个 IP 才能使用不同的 SSL 证书:如何在 Apache 上为虚拟主机设置不同的 SSL 证书?

会话

您的应用程序将需要检查域。为特定域设置了 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
}
于 2013-01-02T11:56:22.097 回答