通过多域托管防止直接访问主域上的网站

Posted

技术标签:

【中文标题】通过多域托管防止直接访问主域上的网站【英文标题】:Prevent direct access to website on primary domain with multi-domain hosting 【发布时间】:2012-09-12 04:22:06 【问题描述】:

我最近购买了多域托管,并在我的计划中托管了多个域。其他域托管在我的主域中的子文件夹上。所以当我转到www.secondarydomain.com 时,它会显示位于www.primarydomain.com/secondarydomain 的网站。

现在我想做的是在有人尝试访问 www.primarydomain.com/secondarydomain 时阻止直接访问,同时保持 www.secondarydomain.com 处于活动状态。

我该怎么做?

【问题讨论】:

【参考方案1】:

通过httpd.conf启用mod_rewrite和.htaccess,然后把这段代码放到你.htaccessDOCUMENT_ROOT目录下:

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

RewriteCond %REQUEST_FILENAME -d
RewriteCond %HTTP_HOST ^www\.primarydomain\.com$ [NC]
RewriteCond %THE_REQUEST ^[A-Z]3,\s/+([^\s\?]+)
RewriteRule ^ http://www.%1.com [R=302,L]

一旦你确定它工作正常,将 302 更改为 301。

PS:请记住,它会将带有物理目录 foo 的每个 URL(例如 http://www.primarydomain.com/foo)重定向到 http://www.foo.com

编辑 - 为避免匹配某些已知文件夹,请使用负前瞻,如下所示:

RewriteCond %REQUEST_FILENAME -d
RewriteCond %HTTP_HOST ^www\.primarydomain\.com$ [NC]
RewriteCond %THE_REQUEST ^[A-Z]3,\s/+([^\s\?]+)
RewriteRule ^(?!(foo|bar|baz)/).*$ http://www.%1.com [R=302,L]

【讨论】:

+1 感谢您的工作示例。如何修改它以排除某些文件夹? 抱歉回复晚了。请立即检查我的编辑部分。 我实际上遇到了这个问题 - 几天后 htaccess 文件确实开始与其他托管域发生冲突,大多数都停止工作!所以我不得不删除 htaccess 文件。我与我的托管公司交谈,他们告诉我,如果我在子文件夹中没有 htaccess 文件,这将暗示父文件夹中 htaccess 文件的条件。 有一些方法可以避免在子文件夹中执行此 .htaccess,但我建议您首先在您的问题中发布您当前的 .htaccess,并提供更多关于实际停止工作的详细信息。 对不起,我犯了一个错误,你的代码很好,我只是无法让它按我想要的方式工作,所以我使用了 HTACCESS 生成器并进行了一些冲突的重定向,这弄乱了一切。一些域没有解析,一个正在从 www.thedomain.com 重定向到 www.thedomain.com/subfolder-name (其中 subfolder-name 是托管文件夹,即root/subfolder/wwwroot【参考方案2】:

我知道在 IIS 中,您可以设置规则,以便如果有人从 www.primarydomain.com/secondarydomain 进入,您可以将他们重定向到 www.secondarydomain.com。这是您要查找的基本模式匹配,如果它解析为“true”,它将按照您的指示重定向。

如果您根本不希望 www.primarydomain.com/secondarydomain 工作,您可以做同样的事情,除了重定向到错误页面。我确信 apache 和其他服务器具有类似的功能,但我只在 IIS 中处理过它。它被称为 URL 重写和重定向。

希望这会有所帮助。

【讨论】:

这不会造成无限循环吗?访问 secondarydomain.com 名称会重定向到我的主机(primarydomain/子文件夹),而主域会重定向到 secondarydomain.com 不,我不是这个意思。您只能从 primarydomain/子文件夹重定向到您的 secondarydomain.com。你不会以相反的方式重定向。 哦不,我只是认为当域名解析并连接到我的服务器时,mod_rewrite 会发生 - 但事实并非如此,因为 htaccess 在根文件夹中而不是在子文件夹中

以上是关于通过多域托管防止直接访问主域上的网站的主要内容,如果未能解决你的问题,请参考以下文章

如果我使用 www,我可以从子域访问 iframe 的内容吗?在主域上?

错误 Bad Request (400),当我访问域上的站点时

托管在不同域上的 JavaScript 可以读取/修改另一个域的 DOM 吗?

在 Hetzner 托管的附加域上安装 WordPress

同一域上的多个 Laravel 5 项目

从子文件夹托管主域