gpt4 book ai didi

cakephp - 处理用户自定义域的最优雅方式是什么?

转载 作者:行者123 更新时间:2023-12-04 21:22:59 26 4
gpt4 key购买 nike

在我的网站上,用户拥有可以通过 http://mysite.com/vanity_url 访问的公开资料。 .我想允许用户将他们自己的域指向他们在我网站上的个人资料页面。 Just like Bandcamp does .

我的 Profile模型有这两个字段来处理这个:vanity_url ,这是字段的普通用户名类型;和一个新的 custom_domain这是他们自己的域名,例如,example.com .

这是我迄今为止所做的,但恐怕它可能不是最优雅、最安​​全、最有效的方法。

首先,我确定了 Apache 的 DocumentRoot设置为我的应用程序的 webroot目录,所以我可以告诉用户将他们的 DNS 指向我网站的 IP。

现在,这就是我的routes.php 上的路由规则。看起来像:

if (preg_match('/mysite\.com\.?$/', $_SERVER['SERVER_NAME'])){
// Normal routes when visitors go to my domain
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
Router::connect('/pages/**', array('controller' => 'pages', 'action' => 'display'));

// Move all other actions to a separate '/app/' area
Router::connect('/app/:controller/:action/**');
Router::connect('/app/:controller/**');

// Handle profile URLs
Router::connect('/:profile/**',
array('controller' => 'profiles', 'action' => 'view'),
array('pass' => array('profile'), 'profile' => '[0-9a-zA-Z\-\_]+')
);
}
else{
// If visitors come via a URL different to mysite.com, I let
// the ProfilesController deal with it passing the current SERVER_NAME
// as a param to the 'view' action
Router::connect('/', array(
'controller' => 'profiles',
'action' => 'view',
$_SERVER['SERVER_NAME'], // 'url' param
true // 'customDomain' param
));
Router::redirect('/*', 'http://mysite.com');
}

这就是 viewProfilesController 采取行动好像:
public function view($url = null, $customDomain = false) {
if ($url){
// Find the profile by its vanity_url or its custom_domain
$findOptions = array(
'conditions' => $customDomain?
array('custom_domain' => $url) :
array('vanity_url' => $url)
);
if ($profile = $this->Profile->find('first', $findOptions)) {
$this->set('profile', $profile);
}
}
else throw new NotFoundException(__('Invalid profile'));
}

这种方法我会面临什么问题?

另外,有谁知道为什么 Bandcamp 要求用户创建 CNAME 而不是 A 记录来设置子域?我错过了我应该在这里考虑的东西吗?

编辑 有人帮我弄清楚了最后一点:似乎您不能轻易使用 CNAME 记录将裸域指向另一个域。主要问题仍然悬而未决。

最佳答案

一年前我用 cake 1.3 做了类似的事情

此解决方案有 4 个主要步骤:

  • 拥有一个域模型和域数据表,记录所有可能的自定义域和 View ,供您的用户输入他们的自定义域
  • 在 AppController 的 beforeFilter 中创建域检查代码并将用户数据保存到 Session
  • 负责查看公共(public)配置文件的 Controller 操作需要引用保存到 session
  • 的相同用户数据。
  • 您的用户需要通过其域名注册商正确设置 CNAME 和 A 记录

  • Step 1 领域模型和数据表

    我所做的是我有一个名为域的表

    每个域都包含我认为只是 http://....

    域属于用户

    用户拥有多个域
    domains
    ==========
    id web_address user_id main

    main 是一个 tinyint,指示这是否是自 User hasMany Domain 以来要使用的主要 url。

    所以发生的事情是用户需要为域创建一个或更多的新记录。

    步骤 2 在 AppController 的 beforeFilter 中编写代码以确定要显示哪个公共(public)配置文件
    接下来,您的代码需要能够根据每个 http 请求提交的 url 检索用户 ID。

    从此时起,用户指的是查看其公开资料的用户。如果您有登录用户,请不要将此与登录用户混淆。

    我建议您在 中执行此操作AppController 的 beforeFilter。

    像这样的东西
      $currentUser = $this->User->getByDomain(FULL_BASE_URL);
    $this->Session->write('CurrentUser', $currentUser);

    getByDomain for User 模型的代码也是您的练习。鉴于我已经解释了域的架构,应该很容易

    在写入 currentUser 之前,您可能需要检查 Session 数据中的 currentUser,因为您不希望一直写入 Session 数据,尤其是当访问者一次又一次地访问同一个网页时。

    您可能需要将上面的代码片段更改为如下内容:
      $currentUser = $this->Session->read('CurrentUser');

    if(empty($currentUser) OR (!$this->checkUrlAgainstDomain(FULL_BASE_URL, $currentUser['Domain']['domain']))) {
    $currentUser = $this->User->getByDomain(FULL_BASE_URL);
    $this->Session->write('CurrentUser', $currentUser);
    }

    再次,函数 checkUrlAgainstDomain 对您来说是一个练习。

    步骤 3 在 AppController 的 beforeFilter 中编写代码以确定要显示哪个公共(public)配置文件
    您将使用保存在 Session 中的 CurrentUser 数据来确定要显示哪个用户的公共(public)页面。

    我将此作为练习留给您在操作 View 下的 UsersController 中弄清楚

    第 4 步您的用户需要在其域名注册商中输入以下内容
    然后,您的用户需要去他们的域名注册商并在您链接到的常见问题解答中做与 BandCamp 用户类似的事情。
  • 用户的“www”子域应使用 CNAME 指向 example.Lucho.com
  • 用户的根域(不带 www)应该有一个指向您服务器 IP 地址的 A 记录,即您的 Lucho.com 所在的位置
  • 用户必须添加这两个域管理页面,如前所述。域可能需要长达 48 小时才能完全更新。
  • 关于cakephp - 处理用户自定义域的最优雅方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8947095/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com