InvalidArgumentException: The user-entered string '' must begin with a '/', '?', or '#'

Created on 30 October 2024, 3 months ago

Drupal Version

Drupal 11.0.5

Domain module version

2.0.0-beta2

Expected Behavior

[What did you try to do? What URL did you use to do it?]
=> https://example.com/admin/content
This page is not loaded

I get below error.

The website encountered an unexpected error. Try again later.

InvalidArgumentException: The user-entered string '' must begin with a '/', '?', or '#'. in Drupal\Core\Url::fromUserInput() (line 216 of core/lib/Drupal/Core/Url.php).
Drupal\domain_source\HttpKernel\DomainSourcePathProcessor->processOutbound() (Line: 108)
Drupal\Core\PathProcessor\PathProcessorManager->processOutbound() (Line: 392)
Drupal\Core\Routing\UrlGenerator->processPath() (Line: 294)
Drupal\Core\Routing\UrlGenerator->generateFromRoute() (Line: 105)
Drupal\Core\Render\MetadataBubblingUrlGenerator->generateFromRoute() (Line: 765)
Drupal\Core\Url->toString() (Line: 175)
Drupal\Core\Utility\LinkGenerator->generate() (Line: 102)
Drupal\Core\Render\Element\Link::preRenderLink()
call_user_func_array() (Line: 107)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 825)
Drupal\Core\Render\Renderer->doCallback() (Line: 387)
Drupal\Core\Render\Renderer->doRender() (Line: 203)
Drupal\Core\Render\Renderer->render() (Line: 970)
Drupal\views\Plugin\views\field\EntityField->render_item() (Line: 1214)
Drupal\views\Plugin\views\field\FieldPluginBase->advancedRender() (Line: 231)
template_preprocess_views_view_field()
call_user_func_array() (Line: 261)
Drupal\Core\Theme\ThemeManager->render() (Line: 446)
Drupal\Core\Render\Renderer->doRender() (Line: 203)
Drupal\Core\Render\Renderer->render() (Line: 1796)
Drupal\views\Plugin\views\field\FieldPluginBase->theme() (Line: 769)
Drupal\views\Plugin\views\style\StylePluginBase->elementPreRenderRow()
call_user_func_array() (Line: 107)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 825)
Drupal\Core\Render\Renderer->doCallback() (Line: 387)
Drupal\Core\Render\Renderer->doRender() (Line: 203)
Drupal\Core\Render\Renderer->render() (Line: 708)
Drupal\views\Plugin\views\style\StylePluginBase->renderFields() (Line: 574)
Drupal\views\Plugin\views\style\StylePluginBase->renderGrouping() (Line: 462)
Drupal\views\Plugin\views\style\StylePluginBase->render() (Line: 2177)
Drupal\views\Plugin\views\display\DisplayPluginBase->render() (Line: 1592)
Drupal\views\ViewExecutable->render() (Line: 201)
Drupal\views\Plugin\views\display\Page->execute() (Line: 1689)
Drupal\views\ViewExecutable->executeDisplay() (Line: 81)
Drupal\views\Element\View::preRenderViewElement()
call_user_func_array() (Line: 107)
Drupal\Core\Render\Renderer->doTrustedCallback() (Line: 825)
Drupal\Core\Render\Renderer->doCallback() (Line: 387)
Drupal\Core\Render\Renderer->doRender() (Line: 203)
Drupal\Core\Render\Renderer->render() (Line: 238)
Drupal\Core\Render\MainContent\HtmlRenderer->Drupal\Core\Render\MainContent\{closure}() (Line: 593)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 231)
Drupal\Core\Render\MainContent\HtmlRenderer->prepare() (Line: 128)
Drupal\Core\Render\MainContent\HtmlRenderer->renderResponse() (Line: 90)
Drupal\Core\EventSubscriber\MainContentViewSubscriber->onViewRenderArray() (Line: 246)
Symfony\Component\EventDispatcher\EventDispatcher::Symfony\Component\EventDispatcher\{closure}() (Line: 206)
Symfony\Component\EventDispatcher\EventDispatcher->callListeners() (Line: 56)
Symfony\Component\EventDispatcher\EventDispatcher->dispatch() (Line: 188)
Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 106)
Drupal\page_cache\StackMiddleware\PageCache->pass() (Line: 85)
Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 709)
Drupal\Core\DrupalKernel->handle() (Line: 19)

---

Without default domain defined, I was not able to acccess the main page, so I logged in via /user/login, and added the default domain. After that, when I tried to see /admin/content, I get above error. I have two other inactive domains. All have canonical URLs without 'http(s)://', just 'xxx.example.com' for domain host names.

I have stumbled upon a similar error from Googling. Thought it is Domain module, but apparently not.
- https://www.drupal.org/project/autologout/issues/3348080 πŸ› InvalidArgumentException: The user-entered string '' must begin with a '/', '?', or '#' Needs work

Since I can't access one of the most important pages of Drupal, I at least hope to have a quick workaround, until there is a full solution.

πŸ› Bug report
Status

Active

Version

2.0

Component

Code

Created by

πŸ‡°πŸ‡·South Korea keithkhl

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Merge Requests

Comments & Activities

  • Issue created by @keithkhl
  • πŸ‡°πŸ‡·South Korea keithkhl

    Just double checked that after removing the default domain, I can access the /admin/content page again. Now, the main page (www.example.com) is not accessible.

  • πŸ‡ΊπŸ‡ΈUnited States kevinquillen

    I ran into this with a misconfigured Site Studio component and a Link field that was returning "" because it could not look up the user input value, it did not resolve to any entity in the database.

    The problem was here:

    
      /**
       * {@inheritdoc}
       */
      public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) {
        // Load the active domain if not set.
        $active_domain = $options['active_domain'] ?? $this->getActiveDomain();
    
        // Only act on valid internal paths and when a domain loads.
        $external = $options['external'] ?? FALSE;
        if (is_null($active_domain) || $path === '' || $external === TRUE) {
          return $path;
        }
    
        // Set the default source information.
        $source = NULL;
        $options['active_domain'] = $active_domain;
        $entity = NULL;
    
        // Get the current language.
        $langcode = NULL;
        if (isset($options['language'])) {
          $langcode = $options['language']->getId();
        }
    
        // Get the URL object for this request.
        $alias = $this->aliasManager->getPathByAlias($path, $langcode);
        $url = Url::fromUserInput($alias, $options);
    

    I think at a minimum the lines:

        // Get the URL object for this request.
        $alias = $this->aliasManager->getPathByAlias($path, $langcode);
        $url = Url::fromUserInput($alias, $options);
    

    should be wrapped in a try catch. Log the path, request, options, alias and return $path. That gives someone a chance to trace back where the input came from, potentially, and lets pages load.

    I could not access the Content admin, URL Alias page, URL Redirect page, or the Admin Content view or areas like that until I resolved this.

    To get back up and going to debug the problem for your specific local database, you can do:

    if ($path == '') {
      return $path;
    }
    
        // Get the URL object for this request.
        $alias = $this->aliasManager->getPathByAlias($path, $langcode);
        $url = Url::fromUserInput($alias, $options);
    

    in DomainSourcePathProcessor.php. That will prevent the pages from crashing so you can trace back the error. In my case, I snagged a database, fixed the content issue, and pushed the database back under maintenance to get the site back online.

  • πŸ‡ΊπŸ‡ΈUnited States kevinquillen

    I tried looking at other examples of outbound processors in core and contrib, but I could not locate any that themselves called Url::fromUserInput. The only route I can think of is to at least try/catch here so it prevents the OP from occurring and offers some way of recovering and fixing the data.

    This was really hard to replicate - somehow my issue (and assume OP issue) was that $path was passed as NULL (or ''). Which should not happen, and the how it happened... not quite sure. But a try/catch won't harm anything here.

  • Pipeline finished with Success
    15 days ago
    Total: 216s
    #396767
Production build 0.71.5 2024