草庐IT

php - 网站部分的不同域

coder 2024-01-01 原文

有两个网站,我们称它们为 a.com b.com ;到目前为止,他们已经完全分开了。但是,存在“协同效应”,因此客户希望使 b.com 成为 a.com 的一部分(相同的媒体库、用户、主机、数据库等)……但拥有自己的域和设计。 站点内的站点,具有自己的域。

所以,基本上:当用户访问站点的特定部分时 - 假设 a.com/b,URL 应更改为 b.com。

我想我可以用 apache 虚拟主机解决这个问题;我找到了这个关于如何使用 Yii 的答案:
Assign different domain for two controllers only

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

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

最佳答案

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

(以下假设您同时控制 example.comsecondary.com,并且它们都指向 WordPress 安装所在的同一台服务器。此外,以下示例已直接从我的脑海中拉出,没有涉及真正的测试或验证,它可能会或可能不会按原样工作。)

使 WP 接受多个主机名的请求

通常 WordPress 绑定(bind)到单个主机名/域,它可以在其中提供页面和内容。域存储在 wp_optionssiteurlhome行为 http://www.example.com例如。

您可以在 wp-config.php 中覆盖它通过使用 WP_SITEURLWP_HOME PHP 常量。首先,您需要确保主域(例如 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中的页面中删除页面slug

现在你有一个用户坐在 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';
});

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

我还建议研究如何 Hook 媒体上传过程,以使两个 WP 安装使用相同的目录和数据。使用 upload_dir 可以实现相同的目录过滤器和附件的保存方式与帖子类似,因此您可以使用 wp_insert_post 将上传内容复制到两个站点。或类似的我认为。

此外,您可以使用一些 wp-config.php 将两个 WP 安装与单个用户表一起使用。诡计。

关于php - 网站部分的不同域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35125817/

有关php - 网站部分的不同域的更多相关文章

  1. ruby - Ping ruby 网站? - 2

    在Ruby中可以使用哪些替代方法来ping一个ip地址?标准库“ping”库的功能似乎非常有限。我对在这里滚动我自己的代码不感兴趣。有没有好的gem?我应该接受它并忍受它吗?(我在Linux上使用Ruby1.8.6编写代码) 最佳答案 net-ping值得一看。它允许TCPping(如标准ruby​​ping),但也允许UDP、HTTP和ICMPping。ICMPping需要root权限,但其他则不需要。 关于ruby-Pingruby网站?,我们在StackOverflow上找到一个类

  2. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  5. ruby - 从 sinatra 中的 before do block 返回不同的值 - 2

    有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子

  6. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  7. ruby - 拆分字符串并分配给不同的变量 - 2

    我从ui中得到日期范围为-approved_between"=>"2013-03-17-2013-03-18"我需要拆分此approved_start_date="2013-03-17"和approved_end_date="2013-03-18"...我希望使用它在mysql中查询,因为mysql中的日期格式是created_at:2012-07-2810:35:01.我正在做的是:approved=approved_between.split("")approved_start_date=approved[0]approved_end_date=approved[2]很确定这不是处

  8. ruby - 如果散列有 key ,则使用它。否则,使用不同的 key - 2

    response是一个散列,可能看起来像以下两种情况之一:response={'demo'=>'nil','test_01'=>'DemoData'}或response={'test'=>'DemoData','demo'=>'nil'}我想做这样的事情:ifresponse.has_key?'test_01'new_response.update(:nps_score=>response['test_01']elsenew_response.update(:nps_score=>response['test']end是否有更“Ruby”的方法来解决这个问题?也许使用||的东西运算符(

  9. ruby - 使用 Ruby 和 Mechanize 登录网站 - 2

    我需要从站点抓取数据,但它需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我是使用mechanize的新手,我真的对如何使用它感到困惑。我看到这个例子经常被引用:require'rubygems'require'mechanize'a=Mechanize.newa.get('http://rubyforge.org/')do|page|#Clicktheloginlinklogin_page=a.click(page.link_with(:text=>/LogIn/))#Submittheloginformmy_page=login_page.form_with(:act

  10. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

随机推荐