Problem/Motivation
In some projects, clients upload self-contained mini web embeds or flipping books into the Drupal files folder. These bundles contain static assets (HTML, CSS, JavaScript, etc.) that are transparent to Drupal — Drupal has no entity representation of them. The only connection to Drupal is a link, manually inserted into content, pointing to the embedded mini-site.
In these cases, Entity Mesh reports those links as broken internal links. They are internal because they share the same domain as the Drupal site, but there is no file entity associated with the target. As a result, valid links are flagged as broken, which is misleading for editors and erodes trust in the report.
Steps to reproduce
- Upload a static mini-site (e.g. an HTML flipbook) into the Drupal files directory, outside of any managed file entity.
- Create content with a manual link pointing to that mini-site (same domain as the Drupal site).
- Run Entity Mesh link analysis.
- Observed: the link is reported as a broken internal link.
- Expected: the link is recognized as valid because the target file physically exists.
Proposed resolution
Entity Mesh should detect this scenario and, instead of relying solely on the existence of a file entity, verify that the file the link points to actually exists in the filesystem.
This check must account for the fact that the Drupal files folder may reside in:
- The local filesystem (same server as Drupal), or
- An external object storage service such as Amazon S3 (AWS).
The existence check should therefore go through Drupal's stream wrappers / file system abstraction rather than assuming a local path, so it works regardless of where the files are stored.
Remaining tasks
- Confirm the desired behavior: treat as valid when the file exists, or introduce a distinct status (e.g. "unmanaged file – exists") vs. broken.
- Define how to resolve a public URL back to a file path across stream wrappers (local and remote/S3).
- Implement the existence check.
- Add tests covering local filesystem and remote (S3) storage.
| Comment | File | Size | Author |
|---|---|---|---|
| #4 | after_check_unmanaged.png | 117.16 KB | eduardo morales alberti |
| #4 | broken.png | 117.86 KB | eduardo morales alberti |
Issue fork entity_mesh-3594372
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
lpeidro commentedThe implementation is ready to valide to include in the next release.
Comment #4
eduardo morales albertiReview and testes, fixed!


Before:
After check unmanaged:
Comment #5
eduardo morales albertiSolving cspell
Comment #7
eduardo morales alberti