phacility/phabricator · error · Exception

This blog is not visible to logged out users, so it can not

Error message

This blog is not visible to logged out users, so it can not be visited from a custom domain.

What it means

PhameBlogSite::getSiteByDomain resolves the request Host with an anonymous (logged-out) PhabricatorUser as viewer and only ACTIVE blog statuses. If the blog at that custom domain throws PhabricatorPolicyException - its View policy is stricter than Public - the site wraps it as a plain Exception: the blog exists, but logged-out visitors can never read it, so custom-domain routing cannot proceed.

Source

Thrown at src/applications/phame/site/PhameBlogSite.php:50

    if (!$this->isPhameActive()) {
      return null;
    }

    $host = $request->getHost();

    try {
      $blog = id(new PhameBlogQuery())
        ->setViewer(new PhabricatorUser())
        ->withDomain($host)
        ->needProfileImage(true)
        ->needHeaderImage(true)
        ->withStatuses(
          array(
            PhameBlog::STATUS_ACTIVE,
          ))
        ->executeOne();
    } catch (PhabricatorPolicyException $ex) {
      throw new Exception(
        pht(
          'This blog is not visible to logged out users, so it can not be '.
          'visited from a custom domain.'));
    }

    if (!$blog) {
      return null;
    }

    return id(new PhameBlogSite())->setBlog($blog);
  }

  public function new404Controller(AphrontRequest $request) {
    return new PhameBlog404Controller();
  }

  public function getRoutingMaps() {
    $app = PhabricatorApplication::getByClass('PhabricatorPhameApplication');

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Set the blog's View Policy to Public (Phame > blog > Edit Policies) so anonymous visitors can read it
  2. Verify the blog status is Active - archived blogs do not resolve on custom domains either
  3. Confirm the configured custom domain matches the Host header exactly (apex vs www)
Defensive patterns

Strategy: validation

Validate before calling

// Before binding a custom domain, require anonymous visibility
if ($blog->getViewPolicy() !== PhabricatorPolicies::POLICY_PUBLIC) {
  throw new Exception('Blog view policy must be Public to serve a custom domain.');
}

Prevention

When it happens

Trigger: A custom domain is bound to a Phame blog whose View Policy is 'All Users', 'Administrators', or a project policy; navigating to http://blog.example.com while not logged in; the policy was tightened after the domain was configured.

Common situations: Operators set up a custom domain but forget the public-visibility requirement; internal blogs accidentally given domains; SSO-gated installs where 'All Users' still blocks anonymous readers.

Understand the failure class

Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/f5be485bc2de3fcc. Report an issue: GitHub.