网站部分的不同域名

时间:2016-02-01 08:19:30

标签: php wordpress apache

有两个网站,我们称之为 a.com b.com ;直到现在他们已经完全分开了。然而,有协同作用,因此客户希望将b.com作为a.com的一部分(相同的媒体库,用户,主机,数据库等)......但是有了这个...自己的域名和设计。 网站内的网站,拥有自己的域名。

所以,基本上:当用户访问网站的特定部分时 - 让我们说a.com/b,网址应该更改为b.com。

我认为我可以用apache虚拟主机解决这个问题;我发现这个如何使用Yii: Assign different domain for two controllers only

但是我使用Wordpress(已经成为主站点),所以我应该选择vanilla PHP和Apache调整。欢迎任何提示和指示。

请注意:这与多站点无关,因为这会使公共媒体库和用户等的好处失效。

4 个答案:

答案 0 :(得分:8)

如果您想使用单个WordPress安装,您要么想要使用域映射插件运行WordPress Multisite(您似乎不想这样做),或者让WordPress接受任何请求主机名(域)来运行在每个域上有条件地提供和提供内容。

(以下假设您同时控制example.comsecondary.com,并且它们都指向WordPress安装所在的同一服务器。此外,以下示例已直接从我的头部拉出来涉及的实际测试或验证,它可能会或可能不会按原样运行。)

让WP为请求接受多个主机名

通常,WordPress与单个主机名/域绑定,可以在其中提供页面和内容。例如,域wp_options存储在siteurl homehttp://www.example.com行中。

您可以使用wp-config.phpWP_SITEURL PHP常量在WP_HOME中覆盖此内容。首先,您需要确保将主域(例如maindomain.com)正确设置为wp_options表行siteurlhome。然后,您需要调整wp-config.php文件以使WP接受任何域:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);

(如果需要,请务必在HTTP和HTTPS之间进行调整。

现在,当域指向服务器时,WP安装应该可以正常打开。您可以拥有任意数量的域,并且在访问时它们都会加载WP。

将页面重定向到另一个域

您可以使用.htaccess或WP代码进行重定向。如果重定向是应用程序/站点特定的,并且应该可以在任何地方使用,请尝试使用WP代码,因为这更可能在源代码回购等中使用。

add_action('template_redirect', function () {
    $isMainDomain = strpos($_SERVER['REQUEST_URI'], 'example.com') !== false;

    // We are on primary domain and on domain.com/b
    if ($isMainDomain && is_page('b')) {
        wp_redirect('http://secondary.com');
        exit;
    }

    // You need to validate child pages too and redirect where needed.
});

将其添加到插件或主题functions.php。现在,当有人访问主域中的b页面时,他们将被重定向到secondarydomain.com

要使用.htaccess实现此目的,您可以尝试以下

RewriteEngine on
RewriteBase /

// Redirect page `b` and all child pages to other domain.
RewriteCond %{HTTP_HOST} example.com$
RewriteRule ^b/(.*)$ http://www.secondary.com/$1 [L,QSA,R=301]

从WP

中的页面中删除页面段

现在您有一位用户坐在http://www.secondary.com,但是用户看到了WP安装的首页,而不是页面b的内容。

使用.htaccess重写,您可以将这些域请求代理到某个"子目录"如果你需要。

RewriteEngine on
RewriteBase /

# Something like the following should hide the `b` page/dir from requests.
RewriteCond %{HTTP_HOST} secondary.com$
RewriteRule ^(.*)$ http://www.secondary.com/b/$1 [L,QSA]

该规则首先检查请求是否针对secondary.com域名。如果是,服务器会重写对WordPress页面b及其子页面的所有请求。

现在当有人打开http://www.secondary.com时,它应该映射到http://www.secondary.com/b并显示该页面。

(注意:我没有测试上述规则,因此它可能会或可能不会按原样运行。

修复永久链接

现在您对页面b的永久链接存在问题。获取固定链接会返回http://www.example.com/b,而应返回http://www.secondary.com

为固定链接添加过滤器应解决该问题:

add_filter('post_link', function ($link, $post) {
    if (is_admin()) {
        // Don't change in admin, or editing pages may break
        return $link;
    }

    // Check here that if the $post is either page `b`
    // or a child of that page
    // then return the proper link instead.
    return 'http://www.secondary.com/foo/bar';
});

这是一种浅薄的方法,不考虑媒体或用户的行为方式。您需要验证两个域是否允许跨源请求,并且在需要时为跨源会话正确保存用户会话cookie。

我还建议研究如何挂钩媒体上传过程,使两个WP安装使用相同的目录和数据。使用upload_dir过滤器可以获得相同的目录,并且附件的保存方式与帖子类似,因此您可以使用wp_insert_post或类似的I假设将上传内容复制到两个网站。

此外,您可以使用一些wp-config.php技巧使用单个用户表的两个WP安装。

答案 1 :(得分:5)

  

所以,基本上:当用户访问网站的特定部分时 - 让我们说a.com/b,网址应该更改为b.com。

听起来你只需要在a.com/b创建一个文件/控制器/帖子,它会将浏览器重定向到b.com

最简单的方法是在根目录中创建一个名为b的目录,并将apache默认文件放在那里(index.htm,index.php等),该文件将具有重定向头

理想的方法是使用.htaccess进行301重定向。像

这样的东西
Redirect 301 /b http://b.com

或使用通配符:

RedirectMatch 301 /b(.*) http://b.com/$1

(网上有大量的htaccess资源)

这是两个极端,中间还有很多其他选项,您应根据有多少重定向选择最适合您的选项,是否有任何模式,您是否希望能够生成它们动态等等。

您可能遇到的问题(您从未完全描述过这个问题,所以我只是说),以防您想要返回a.com并且无法设置类似的重定向在b.com上。在这种情况下,我建议您在a / b中在iframe中进行b.com渲染时简单地说。

答案 2 :(得分:0)

如果你不想搞乱wp过滤器或你的htaccess规则

您只需在名为/ b /的目录中创建index.html即可 或创建一个带有值为'b'a.com/b的slug的页面,其代码为plain html

<script>top.location='http://b.com'</script>

答案 3 :(得分:0)

只需在b.com底部添加©通知,使其成为a.com的一部分(或者只添加“此网站是a.com的一部分”或类似内容)。如果您想将a.com链接到b.com,请添加类似的链接 &lt; a href =“b.com”&gt; b.com&lt; / a&gt;
。如果您想在a.com中使用域名,那么只需从a.com/b重定向到b.com ...